@author:dlive
ASLR address space layout randomization
微軟從windows vista/windows server 2008(kernel version 6.0)開始采用ASLR技術,主要目的是為了防止緩沖區溢出
ASLR技術會使PE檔案每次加載到記憶體的起始位址随機變化,并且程序的棧和堆的起始位址也會随機改變。
該技術需要作業系統和編譯工具的雙重支援(主要是作業系統的支援,編譯工具主要作用是生成支援ASLR的PE格式)
若不想使用ASLR功能,可以在VS編譯的時候将“配置屬性->連結器->進階->随機基址”的值修改為否即可
下面對比ASLR.exe和ASLR_no.exe的PE資訊的差別。(x86的可執行檔案,兩個exe編譯時的差別僅為是否開啟ASLR選項)
PE資訊對比
.reloc節區

ASLR.exe比ASLR_no.exe多了一個.reloc節區,這個節區在前面DLL的章節講解過,其中存儲了程式中的寫死資訊。
IMAGE_FILE_HEADER\Characteristics
ASLR.exe中
Characteristics(0102) = IMAGE_FILE_EXECUTABLE_IMAGE(0002) | IMAGE_FILE_32BIT_MACHINE(0100)
ASLR_no.exe中
Characteristics(0103) = IMAGE_FILE_RELOCS_STRRIPED(0001) | IMAGE_FILE_EXECUTABLE_IMAGE(0002) | IMAGE_FILE_32BIT_MACHINE(0100)
後者比前者多一個IMAGE_FILE_RELOCS_STRRIPED标志,該标志含義為:
Relocation information was stripped from the file. The file must be loaded at its preferred base address. If the base address is not available, the loader reports an error.
https://msdn.microsoft.com/en-us/library/windows/desktop/ms680313(v=vs.85).aspx
IMAGE_OPTIONAL_HEADER\DllCharacteristics
ASLR.exe比ASLR_no.exe的DllCharacteristics多了一個IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE标志
該标志的含義為
The DLL can be relocated at load time.
删除PE檔案的ASLR功能
Tips: 如果一個要詳細分析的檔案應用了ASLR功能,分析前可以暫時将ASLR功能删除,然後再調試分析,由于檔案總是被加載到相同的記憶體位址,分析起來會更簡便
删除ASLR功能的方法很簡單,隻需将
IMAGE_OPTIONAL_HEADER\DllCharacteristics
中的
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
标志去掉即可
即将PE中8140的資料改為8100即可
注:本部落格文章轉載需帶上原文連結