天天看點

CTF(Pwn) Rop + ret2libc 題型 正常解法思路 (初級)

參考例題 https://blog.csdn.net/weixin_45556441/article/details/115091036

引子

随着 NX 保護的開啟,以往直接向棧或者堆上直接注入代碼的方式難以繼續發揮效果。攻擊者們也提出來相應的方法來繞過保護,目前主要的是

ROP(Return Oriented Programming),其主要思想是在棧緩沖區溢出的基礎上,利用程式中已有的小片段

(gadgets) 來改變某些寄存器或者變量的值,進而控制程式的執行流程。所謂 gadgets 就是以 ret

結尾的指令序列,通過這些指令序列,我們可以修改某些位址的内容,友善控制程式的執行流程。

之是以稱之為 ROP,是因為核心在于利用了指令集中的 ret 指令,改變了指令流的執行順序。ROP 攻擊一般得滿足如下條件

程式存在溢出,并且可以控制傳回位址。

可以找到滿足條件的 gadgets 以及相應 gadgets 的位址。

如果 gadgets 每次的位址是不固定的,那我們就需要想辦法動态擷取對應的位址了。

解法利用思路:

第一次觸發漏洞,通過ROP洩漏libc的address(如puts_got),計算system位址,然後傳回到一個可以重制觸發漏洞的位置(如main),再次觸發漏洞,通過ROP調用system(“/bin/sh”)

1.利用一個程式已經執行過的函數去洩露它在程式中的位址,然後取末尾3個位元組,去找到這個程式所使
用的libc的版本。

2.程式裡的函數的位址跟它所使用的libc裡的函數位址不一樣,程式裡函數位址=libc裡的函數位址+偏移
量,在1中找到了libc的版本,用同一個程式裡函數的位址-libc裡的函數位址即可得到偏移量

3.得到偏移量後就可以推算出程式中其他函數的位址,知道其他函數的位址之後我們就可以構造rop去執
行system(’/bin/sh‘)這樣的指令
————————————————
           

常用的 EXP 格式 語句

libc=LibcSearcher('puts',puts_addr)     #找到libc版本
offset=puts_addr-libc.dump('puts')     #算出偏移量
binsh=offset+libc.dump('str_bin_sh')   #偏移量+libc函數位址=實際函數位址
system=offset+libc.dump('system')
           

32位程式運作執行指令的時候直接去記憶體位址尋址執行

64位程式則是通過寄存器來傳址,寄存器去記憶體尋址,找到位址傳回給程式

CTF(Pwn) Rop + ret2libc 題型 正常解法思路 (初級)
CTF(Pwn) Rop + ret2libc 題型 正常解法思路 (初級)

查找 rdi, ret 位址的語句:

ROPgadget --binary 檔案名 --only "pop|ret"

ROPgadget --binary 檔案名 --only "pop|ret" | grep rdi