如何在32位系統中使用ROP+Return-to-dl來繞過ASLR+DEP
傳統的利用
return-to-plt+ROP
來繞過ASLR + DEP
的技術需要知道庫中函數的偏移地址,而在沒有libc庫的情況下可以使用Return-to-dl-resolve
技術來達到動態獲得庫函數地址的目的,關於dl-resolve
的技術細節請
點擊閱讀原文了解詳情
。Environment
Vulnerable code
編譯程序並且打開系統的ASLR
:
程序是一個簡單的緩衝區溢出,可以覆蓋返回地址,在DEP
的保護下,我們可以使用ROP
技術來執行代碼,為了繞過ASLR
,這裡使用了return-to-plt
技術。
return-to-plt
call write@plt
調用write@plt
的代碼如下:
函數的plt
其實地址可以用objdump -d -j.plt bof
讀出:
棧的布局如下:
運行:
看到write@plt
被成功調用打出了我們想要的字元串。
Relocation directly
接下來改一下ROP
,將直接調用write@plt
改為將reloc_offset
放在棧中,直接跳到0x8048300
執行:
看到write@plt
的reloc_offset
為0x18
,修改代碼為:
運行:
Make fake Elf32_Rel structure
接下來要建立假的Elf32_Rel
結構體,原來第一個結構體的位置為:
這裡我們可插入一個非常大的reloc_offset
,把結構體位置定位到我們可以控制的區域,選擇區域為base_stage+28
,reloc_offset = (base_stage+28) - addr_relplt
,在指定區域插入偽造的結構體,先看看原來的write
的結構體:
構造為:
後半段改為:
這樣同樣能調用write
:
Make fake Elf32_Sym structure
我們知道在找到Elf32_Rel
結構體後,會通過r_info >> 8
得到Elf32_Sym
結構體的位置
write
的r_info >> 8 = 4
,所以在SYMTAB[4]
,也就是0x80481cc + 64
:
我們可以把結構體放在base_stage + 36
處,原結構體為:
所以構造為:
還要修改Elf32_Rel
結構體中的r_info
,保證:
所以
base_stage + 36
需要加
padding
,使得為
0x10
的倍數,計算得到這裡正好符合
padding
的要求,可以不需要
padding
,修改後為:
結果一樣:
Make fake string table
我們知道Elf32_Sym
結構體第一項是函數名稱字元串在STRTAB
中的偏移:
只需要修改st_name
欄位,直接在Elf32_Sym
結構體後加字元串即可:
結果:
Get shell
只要把writex00
改為systemx00
,然後修改對應的參數就可以了,完整的腳本:
運行:
這樣就在不知道庫中函數偏移的情況下調用了system
。
參考來源: ROP stager + Return-to-dl-resolveによるASLR+DEP迴避
*本文作者:pwdme,轉載請註明來自 FreeBuf.COM
※美國網件ReadyNAS監控系統非認證遠程命令執行漏洞分析
※簡析60度CMS的Cookies欺騙漏洞
※再曝實錘,更多證據顯示俄羅斯或干預了去年的美國大選
※如何用ESP8266做個釣魚測試WIFI
TAG:FreeBuf |