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