在我們利用 x64dbg 等工具調適程式的時候都會看到位置基址常常是在一些很混亂的位置,而且每次都不一樣。而這些隨機變化的位置往往會使我們在逆向工程的時候會覺得很煩,不僅每次都要重新計算,而且對於記憶體的攻擊難以實行。
實際上,這項技術正是用來防止惡意軟體利用 OS 漏洞 ( 主要是 Buffer Overflow
) 來進行破壞系統的技術。名為位址空間組態隨機載入
( Address space layout randomization
: ASLR
) ,
這名子看起來很長很難懂,不過簡單來說就是讓基址每次都會隨機。
本次使用檔案與成品 :
https://github.com/Dinlon5566/IT_Reverse_Engineering/tree/main/Dx26
那來看看關閉 ASLR
前後的狀況會如何 :
首先,要有一份有 ASLR 與沒有 ASLR 的程式,透過 Visual studio 的選項可以輕易開啟與關閉。
這邊有了兩份程式
先試著利用 x64dbg 來檢視基址的差別
ASLR-x64.exe : 跟以前一樣,基址是隨機的。
noASLR-x64.exe : 基址是 0x140000000
,看著就很舒服。
另外看一下 Option Header
的 Image Base
位置,兩者都是 0X140000000
。不過只有關閉 ASLR 的有確實加載在該位置上。
透過比對 File Header
可以看見沒有 ASLR 的程式在 Characteristic
中多出了 1
,代表 IMAGE_FILE_RELOCS_STRIPPED
,代表這份文件不包含基址重定位,因此必須加載在基址上面。
https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#characteristics
Option Header
中的 DLL Characteristics
中,有 ASLR 的多了 40
;意味著IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
,DLL檔案可以在加載時重定位。
https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#dll-characteristics
.reloc
這個區塊,使他載入時可以做為重定位的依據。那以上就是有 ASLR 與 沒有 ASLR 的差別。
那了解了兩者的差異,那就來試試看把 ASLR 去除掉吧 。
首先,目標是把 DLL Characteristics
的 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
改掉,使程式不能重定位。
0x156
有資料 8160
,去掉 40
變成 8120
。然後呢 ? 然後就完成了。就是這麼簡單。
看看做完後的運行基址 :
看到 DLL Characteristics
的 40
被減掉後, DLL 就不能重定位了。因此會載入到 0x140000000
這個 Image Base。以上就是關於去除 ASLR 的操作說明。