LyScript 验证PE程序开启的保护
2023-02-18 16:46:13 时间
有些漏洞利用代码需要在某个保护模式被关闭的情况下才可以利用成功,在此之前需要得到程序开启了何种保护方式。验证其实有很多方法,其原理是读入PE文件头部结构,找到OPTIONAL_HEADER.DllCharacteristics
结构,通过与不同的操作数与运算得到,LyScript插件完全可以实现这个验证功能,实现起来也是很简单的。
验证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()
验证得到的保护放入列表如下:
得到了程序开启的保护方式以后,就可以对症下药,提前判断出漏洞攻击后是否可以反弹了。
相关文章
- 【架构师(第五十二篇)】 几个前端工具的基本使用
- 【架构师(第五十三篇)】 性能优化之 HTTP 缓存
- 【前端财富】前端工程师装机指南 (windows10)
- 最近很火的ChatGPT怎么玩?
- 小巧好用的免费虚拟机软件
- [ChatGPT解决方案]生成 nginx 自签名证书
- 完美解决文件格式转换问题
- MariaDB在Oscar故障演练平台的测试实践
- 压缩列表的源码实现
- Docker命令三板斧
- 一文教你快速注册OpenAi(ChatGPT),国内也可以!
- npm自动改版本号+博客静态源代码自动上传
- 宝塔配置SSL证书
- React 组件库 CSS 样式问题分析
- 7个连环问揭开java多线程背后的弯弯绕
- 掌握Java的内存模型,你就是解决并发问题最靓的仔
- 基于ServiceStage的微服务开发与部署(二)
- es6扩展运算符、concat方法合并多个数组
- 【愚公系列】2022年12月 MAUI框架-在线课堂项目的环境配置
- springboot validated注解数据校验 异常处理