@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即可