1. 程式人生 > >pwn by example學習筆記(一)

pwn by example學習筆記(一)

通過一些例子來學習pwn,這些例子來自於github上的ctf-wiki pwn部分

棧溢位原理(示例:ret2text)

首先,獲取要pwn的程式的基本資訊


這個程式是Linux下32位的elf格式的可執行檔案,沒有開啟棧(stack)保護機制,沒有開啟nx

瞭解了程式的基本資訊以後,就執行下程式

發現只有輸入和輸出,而且就只有一個輸入點。

放到ida裡面去跑一下


可以看到,gets從標準輸入裝置讀字串函式,其可以無限讀取,不會判斷上限,以回車結束讀取

我們需要明確的知道輸入到第多少位的時候可以覆蓋到返回地址。

這裡使用cyclic(pwntools中的一個外掛)以使用cyclic pattern來找到return address的位置

Cyclic pattern是一個很強大的功能,大概意思就是,使用pwntools生成一個pattern,pattern就是指一個字串,可以通過其中的一部分資料去定位到他在一個字串中的位置。

在我們完成棧溢位題目的時候,使用pattern可以大大的減少計算溢位點的時間。 比如,我們在棧溢位的時候,首先構造cyclic(0x100),或者更長長度的pattern,進行輸入,輸入後pc的值變味了0x61616161,那麼我們通過cyclic_find(0x61616161)就可以得到從哪一個位元組開始會控制PC暫存器了,避免了很多沒必要的計算。



下面要知道可以利用的控制的返回地址

分析程式發現,有system( )函式,可以利用。


用這個地址(0x804863a)來覆蓋棧上的返回地址

可以看到該漏洞被成功利用了,成功執行了shell

附exp:

from pwn import *
p = process('./ret2text')
address =  0x804863a
payload = 'a'*112+p32(address)
p.sendline(payload)
p.interactive()