代碼
#include <windows.h>
main()
{
HLOCAL h1, h2,h3,h4,h5,h6;
HANDLE hp;
hp = HeapCreate(0,0x1000,0x10000);
h1 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8);
h2 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8);
h3 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8);
h4 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8);
h5 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8);
h6 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8);
_asm int 3//break the process
HeapFree(hp,0,h1);
HeapFree(hp,0,h3);
HeapFree(hp,0,h5);
_asm int 3
h1 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8);
return 0;
}
實驗目的
簡單理解DWORD SHOOT
實驗準備
環境:windows xp
編譯器:vc++
除錯器:OD
實驗程序
1.根據之前動調空表的經驗直接找到申請的堆塊的位置,六塊申請了8個位元組的空間,算上堆頭8個位元組,就相當于六塊16個位元組的記憶體,直接從尾塊上面“切”下來,

2.釋放奇數位的堆塊,防止堆塊合并
發現h1,h3,h5都鏈入了Freelist[2]

此時堆塊的占用狀況
| NAME | Flag | 向前指標 | 向后指標 |
|---|---|---|---|
| h1 | 1 占用態 | 0x003a06a8 (h3) | 0x003a0188(Freelist[2]) |
| h2 | 0 空閑態 | NULL | NULL |
| h3 | 1 占用態 | 0x003a06c8 (h5) | 0x003a0688(h1) |
| h4 | 0 空閑態 | NULL | NULL |
| h5 | 1 占用態 | 0x003a0188(Freelist[2]) | 0x003a06a8 (h3) |
| h6 | 0 空閑態 | NULL | NULL |
如果這時候對某一串資料的向前指標或是向后指標進行修改,那么就能使自己的shellcode成功的載入行程式里面.
例如將h3中的后向指標改為0x12345678前向指標改成0x11111111,那么最后執行鏈表拆卸的時候就是把0x12345678指向的東西移到前向指標的位置上,如果把這些地址換成shellcode的地址就成功裝入程式了,
實際上堆塊的分配、釋放、合并操作都能引發 DWORD SHOOT,因為都涉及到了鏈表,只要修改指標就能匯入惡意代碼,
摘抄《0day安全》
這本書簡單的介紹了一下溢位的攻擊方式,感覺介紹的也比較全面,所以直接摘抄一手,
(1)記憶體變數:修改能夠影響程式執行的重要標志變數,往往可以改變程式流程,例如,更改身份驗證函式的回傳值就可以直接通過認證機制,堆疊溢位時溢位的資料必須連續,而 DWORD SHOOT 可以更改記憶體中任意地址的資料,
(2)代碼邏輯:修改代碼段重要函式的關鍵邏輯有時可以達到一定攻擊效果,例如,程式分支處的判斷邏輯,或者把身份驗證函式的呼叫指令覆寫為 0x90(nop),
(3)函式回傳地址:堆疊溢位通過修改函式回傳地址能夠劫持行程,堆溢位也一樣可以利用DWORD SHOOT 更改函式回傳地址,但由于堆疊幀移位的原因,函式回傳地址往往是不固定的,甚至在同一作業系統和補丁版本下連續運行兩次堆疊狀態都會有不同,故 DWORD SHOOT 在這種情況下有一定局限性,因為移動的靶子不好瞄準,
(4)攻擊例外處理機制:當程式產生例外時,Windows 會轉入例外處理機制,堆溢位很容易引起例外,因此例外處理機制所使用的重要資料結構往往會成為 DWORD SHOOT 的上等目標,這包括 S.E.H、F.V.E.H、行程環境塊中的 U.E.F 、執行緒環境塊中存放的第一個S.E.H 指標,
(5)函式指標:系統有時會使用一些函式指標,比如呼叫元件中的函式、C++中的虛函式呼叫等,改寫這些函式指標后,在函式呼叫發生后往往可以成功地劫持行程,但可惜的是,不是每一個漏洞都可以使用這項技術,這取決于軟體的開發方式,
(6)P.E.B 中執行緒同步函式的入口地址:天才的黑客們發現在每個行程的 P.E.B 中都存放著一對同步函式指標,指向 RtlEnterCriticalSection()和 RtlLeaveCriticalSection(),并且在行程退出時會被 ExitProcess()呼叫,如果能夠通過 DWORD SHOOT 修改這對指標中的其中一個,那么在程式退出時 ExitProcess()將會被騙去呼叫我們的 shellcode,由于 P.E.B 的位置始終不會變化,這對指標在 P.E.B 中的偏移也始終不變,這使得利用堆溢位開發適用于不同作業系統版本和補丁版本的 exploit 成為可能,這種方法一經提出就立刻成為了 Windows 平臺下堆溢位利用的最經典方法之一,因為靜止的靶子比活動的靶子好打得多,我們只需要把槍架好,閉著眼睛扣扳機就是了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/92406.html
標籤:其他
