天天看點

pwn by example學習筆記(一)

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

棧溢出原理(示例:ret2text)

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

pwn by example學習筆記(一)
pwn by example學習筆記(一)

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

了解了程式的基本資訊以後,就運作下程式

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

放到ida裡面去跑一下

pwn by example學習筆記(一)

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

我們需要明确的知道輸入到第多少位的時候可以覆寫到傳回位址。

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

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

在我們完成棧溢出題目的時候,使用pattern可以大大的減少計算溢出點的時間。 比如,我們在棧溢出的時候,首先構造

cyclic(0x100)

,或者更長長度的pattern,進行輸入,輸入後pc的值變味了0x61616161,那麼我們通過

cyclic_find(0x61616161)

就可以得到從哪一個位元組開始會控制PC寄存器了,避免了很多沒必要的計算。

pwn by example學習筆記(一)
pwn by example學習筆記(一)
pwn by example學習筆記(一)

下面要知道可以利用的控制的傳回位址

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

pwn by example學習筆記(一)
pwn by example學習筆記(一)

用這個位址(0x804863a)來覆寫棧上的傳回位址

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

pwn by example學習筆記(一)

附exp:

from pwn import *

p = process('./ret2text')

address =  0x804863a

payload = 'a'*112+p32(address)

p.sendline(payload)

p.interactive()

pw