當前位置:
首頁 > 新聞 > 如何在32位系統中使用ROP+Return-to-dl來繞過ASLR+DEP

如何在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@pltreloc_offset0x18,修改代碼為:



運行:



Make fake Elf32_Rel structure


接下來要建立假的Elf32_Rel結構體,原來第一個結構體的位置為:


這裡我們可插入一個非常大的reloc_offset,把結構體位置定位到我們可以控制的區域,選擇區域為base_stage+28reloc_offset = (base_stage+28) - addr_relplt,在指定區域插入偽造的結構體,先看看原來的write的結構體:



構造為:



後半段改為:



這樣同樣能調用write:



Make fake Elf32_Sym structure

我們知道在找到Elf32_Rel結構體後,會通過r_info >> 8得到Elf32_Sym結構體的位置



writer_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

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

美國網件ReadyNAS監控系統非認證遠程命令執行漏洞分析
簡析60度CMS的Cookies欺騙漏洞
再曝實錘,更多證據顯示俄羅斯或干預了去年的美國大選
如何用ESP8266做個釣魚測試WIFI

TAG:FreeBuf |