上次XCTF-game说了之后要学习一波aslr的关闭方法,昨天看了看逆向工程核心原理,发现上面有讲解其关闭的方法,特此记录。
先从pe文件重定位说起。
创建好进程后,exe文件会被首先加载进imagebase指定的内存空间地址,因此不用考虑exe重定位。但是DLL和SYS文件可能因为加载几个,导致除了第一个之外其他文件加载到其他尚未占用的地址。
而开启了aslr之后exe可以不加载到imagebse的位置,另外在aslr之前,dll也总是加载到固定地址。
不仅指令的地址变了,而且见到这些红色的call的地址都是硬编码进入的程序,每次也会变。pe装载器进行重定位处理时,最关键的就是查找硬编码地址的位置。而重定位表就是记录硬编码地址偏移的列表。
基址重定位表地址位于IMAGE_OPTION_HEADER的IMAGE_DATA_DIRECTORY[5]。
前面的DWORD是RVA后面的DWORD是大小
typedef struct _IMAGE_DATA_DIRECTORY {
??? DWORD VirtualAddress;
??? DWORD Size;
} IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;
另外再看看pe头IMAGE_FILE_HEADER这里
在IMAGE_FILE_HEADER的Characteristics字段。可以见到这个Relocations stripped是没有勾上的。
IMAGE_FILE_RELOCS_STRIPPED ??0x0001
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.
大意是,重定位信息从这个文件被剥离,这个文件必须被装在进preferred基址(指的应该就是ImageBase),如果ImageBase不可用,加载器会报错。
我们这里要动手关闭aslr,这个选项不用改。要改的是IMAGE_OPTIONAL_HEADER的DLL Characteristics字段
下面是DLL Characteristics的属性值,相或代表属性叠加。
#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040 // DLL can move.
#define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY 0x0080 // Code Integrity Image
#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100 // Image is NX compatible
#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200 // Image understands isolation and doesn't want it
#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400 // Image does not use SEH. No SE handler may reside in this image
#define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800 // Do not bind this image. // 0x1000 // Reserved.
#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000 // Driver uses WDM model // 0x4000 // Reserved.
#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
将8140改为8100,也就是让DLL不能move
再次执行程序,发现是004...打头的,这个时候aslr就被关上了。