ASLR(Address Space Layout Randomization)
简介
ASLR通过随机放置进程关键数据区域的地址空间来防止攻击者能可靠地跳转到内存的特定位置来利用函数。现代操作系统一般都加设这一机制,以防范恶意程序对已知地址进行Return-to-libc攻击。
作用
地址空间配置随机加载利用随机方式配置数据地址空间,使某些敏感数据(例如操作系统内核)配置到一个恶意程序无法事先获知的地址,令攻击者难以进行攻击。
为什么要去除ASLR
本人作为逆向分析人员,仅为了分析PE文件时,固定其加载地址。
怎么去除
由PE扩展头IMAGE_OPTIONAL_HEADER中的结构体DllCharacteristics中的IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE决定的。
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
其值为0x40时,即开启ASLR;
和0xFFBF进行与运算,将其置零即可。
其值为0时,未开启
🐍Python脚本代码🐍
import os
import sys
import struct
import pefile
class Patch(object):
def __init__(self, filename):
with open(filename, 'rb') as f:
self.data = f.read()
def file2Save(self, filename):
with open(filename, 'wb') as f:
f.write(self.data)
def file2Patch(self, offset, data):
if (offset >= 0) and (offset + len(data)) < len(self.data):
self.data = self.data[0:offset] + data + self.data[offset + len(data):]
return True
else:
return False
def PE_GetDllcharacteristics(pe):
offset = pe.OPTIONAL_HEADER.get_field_absolute_offset('DllCharacteristics')
value = pe.OPTIONAL_HEADER.DllCharacteristics
return offset, value
def PE_DisableASLR(file):
pe = pefile.PE(file)
offset, value = PE_GetDllcharacteristics(pe)
if value:
print("PE文件开启随机基址")
value &= 0xFFBF
patch = Patch(file)
if patch.file2Patch(offset, struct.pack('<H', value)):
(fileDir, fileFullName) = os.path.split(file)
(fileName, fileExtension) = os.path.splitext(fileFullName)
nameNewFullName = fileName + "_DisableASLR" + fileExtension
patch.file2Save(nameNewFullName)
print("关闭PE的随机基址的新文件为" + nameNewFullName)
else:
print("PE未开启随机基址")
file = r'也可以在PyCharm里面定义文件路径'
if __name__ == '__main__':
# 命令行调用方式
PE_DisableASLR(sys.argv[1])
# 编辑器里面定义方式
# PE_DisableASLR(file)