通過一些例子來學習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()