有些破绽利用代码须要在某个保护模式被敞开的状况下才能够利用胜利,在此之前须要失去程序开启了何种保护方式。验证其实有很多办法,其原理是读入 PE 文件头部构造,找到 OPTIONAL_HEADER.DllCharacteristics
构造,通过与不同的操作数与运算失去,LyScript 插件齐全能够实现这个验证性能,实现起来也是很简略的。
- 插件地址:https://github.com/lyshark/Ly…
验证 PE 保护方式: 验证本身保护方式无须要遍历加载过的模块,读入 DllCharacteristics
并顺次与操作数与运算失去主程序的保护方式。
from LyScript32 import MyDebug
import pefile
if __name__ == "__main__":
# 初始化
dbg = MyDebug()
dbg.connect()
# 依据 text 节失去程序首地址
base = dbg.get_base_from_address(dbg.get_local_base())
byte_array = bytearray()
for index in range(0,4096):
read_byte = dbg.read_memory_byte(base + index)
byte_array.append(read_byte)
oPE = pefile.PE(data = byte_array)
# 随机基址 => hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x40 == 0x40
if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 64) == 64):
print("基址随机化: True")
else:
print("基址随机化: False")
# 数据不可执行 DEP => hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x100 == 0x100
if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 256) == 256):
print("DEP 爱护状态: True")
else:
print("DEP 爱护状态: False")
# 强制完整性 => hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x80 == 0x80
if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 128) == 128):
print("强制完整性: True")
else:
print("强制完整性: False")
if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 1024) == 1024):
print("SEH 异样爱护: True")
else:
print("SEH 异样爱护: False")
dbg.close()
程序运行后即可输入,以后主程序内启用了何种保护方式:
如果须要验证以后程序加载的所有模块,则能够通过 dbg.get_all_module()
遍历加载过的模块,并顺次读入 DllCharacteristics
与操作数进行与运算失去保护方式。
from LyScript32 import MyDebug
import pefile
if __name__ == "__main__":
# 初始化
dbg = MyDebug()
dbg.connect()
# 失去所有加载过的模块
module_list = dbg.get_all_module()
print("-" * 100)
print("模块名 \t\t\t 基址随机化 \t\t DEP 爱护 \t\t 强制完整性 \t\t SEH 异样爱护 \t\t")
print("-" * 100)
for module_index in module_list:
print("{:15}\t\t".format(module_index.get("name")),end="")
# 顺次读入程序所载入的模块
byte_array = bytearray()
for index in range(0, 4096):
read_byte = dbg.read_memory_byte(module_index.get("base") + index)
byte_array.append(read_byte)
oPE = pefile.PE(data=byte_array)
# 随机基址 => hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x40 == 0x40
if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 64) == 64):
print("True\t\t\t",end="")
else:
print("False\t\t\t",end="")
# 数据不可执行 DEP => hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x100 == 0x100
if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 256) == 256):
print("True\t\t\t",end="")
else:
print("False\t\t\t",end="")
# 强制完整性 => hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x80 == 0x80
if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 128) == 128):
print("True\t\t\t",end="")
else:
print("False\t\t\t",end="")
if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 1024) == 1024):
print("True\t\t\t",end="")
else:
print("False\t\t\t",end="")
print()
dbg.close()
验证失去的爱护放入列表如下:
失去了程序开启的保护方式当前,就能够隔靴搔痒,提前判断出破绽攻打后是否能够反弹了。