有些漏洞利用代码需要在某个保护模式被关闭的情况下才可以利用成功,在此之前需要得到程序开启了何种保护方式。验证其实有很多方法,其原理是读入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()

验证得到的保护放入列表如下:

得到了程序开启的保护方式以后,就可以对症下药,提前判断出漏洞攻击后是否可以反弹了。

LyScript 验证PE程序开启的保护的更多相关文章

  1. linux程序的常用保护机制

    操作系统提供了许多安全机制来尝试降低或阻止缓冲区溢出攻击带来的安全风险,包括DEP.ASLR等.在编写漏洞利用代码的时候,需要特别注意目标进程是否开启了DEP(Linux下对应NX).ASLR(Lin ...

  2. Android程序的签名保护及绕过方法

    随着Android 市场的扩大,各类盗版.破解.打包党纷纷涌现,其使用的手法无非是apk _> smali ->修改代码 ->重打包签名,为对抗此类技术,广大程序员挖掘了Androi ...

  3. C# WinForm 应用程序 开启Console窗口

    /********************************************************************************* * C# WinForm 应用程序 ...

  4. 从内存中直接运行PE程序

    效果是这样的,假设一个PE数据在内存里面了,我们利用下面我讲的技术可以直接建立一个进程并运行这个PE,当然直接在本进程运行在可以,这两钟技术在前些时日我都有实现,今天我只说关于建立进程并运行的,当然, ...

  5. windows 怎么验证域名是否开启了 https

    由于 ping 是针对 IP 层的,只能检查当前系统网络与网络中某个IP,某个域名是否连通. 当我们需要验证域名是否开启了 https时,用如下方法: 1. 下载tcping.exe,放到本机C盘根目 ...

  6. 【iOS系列】-程序开启后台运行

    [iOS系列]-程序开启后台运行 iOS程序是伪后台的运行,可是有时候我们需要让其在后台也要进行一些操作,我们可以让其伪装成音乐的APP,这样就可以让程序后台进行相关操作了,具体做法如下: 1:在Ap ...

  7. php实现 密码验证合格程序(复杂问题分类,超简单的)(分类+规范编码)

    php实现 密码验证合格程序(复杂问题分类,超简单的)(分类+规范编码) 一.总结 一句话总结:复杂问题分类,超简单的.分类+规范编码. 1.写的时候判断  不能有相同长度超2的子串重复  的时候,子 ...

  8. C# 控制台或者winform程序开启http的监听状态

    1 public class THttpListener { HttpListener listerner; /// <summary> /// /// </summary> ...

  9. bootstrapValidator对于隐藏域验证和程序赋值即时验证的问题

    问题1: 如下代码: <input type="hidden" name="productId"/> $("#addForm") ...

  10. 身份证号验证js程序

    最近注册一个网站,居然让我输入个人身份证号,身份证号是个人信息,怎么能告诉你呢? 输入正确的身份证号没有任何问题. 我就仅仅改了最后一位,就告诉我身份证号不对,你是怎么知道的呢?所以,搜了下身份证号的 ...

随机推荐

  1. .NET使用QuestPDF高效地生成PDF文档

    前言 在.NET平台中操作生成PDF的类库有很多如常见的有iTextSharp.PDFsharp.Aspose.PDF等,今天我们分享一个用于生成PDF文档的现代开源.NET库:QuestPDF,本文 ...

  2. SpringBoot 项目实战 | 瑞吉外卖 Day01

    一.软件开发整体介绍 1.软件开发流程 2.角色分工 项目经理:对整个项目负责,任务分配.把控进度 产品经理:进行需求调研,输出需求调研文档.产品原型等 UI设计师:根据产品原型输出界面效果图 架构师 ...

  3. POJ2431 优先队列+贪心

    题目大意: 见<挑战程序设计竞赛>P74. 我的理解: 优先队列+贪心 注意把输入的距离(加油站到终点)改为起点到加油站. 因为求得是最优解,需要尽可能少的加油站,所以我们每次希望去加油的 ...

  4. Problem 330A - Cakeminator (思维)

    330A. Cakeminator https://codeforces.com/problemset/problem/330/A 题意很容易理解:给定一块蛋糕区域,但蛋糕上有几个不能吃的草莓,大胃王 ...

  5. 【动态规划】动态规划基础 (OI wiki)

    文章来自 OI wiki ,转载仅作学习使用 动态规划应用于子问题重叠的情况: 要去刻画最优解的结构特征: 尝试递归地定义最优解的值(就是我们常说的考虑从 \(i - 1\) 转移到 \(i\)): ...

  6. Tomcat 9.0.26 高并发场景下DeadLock问题排查与修复

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/-OcCDI4L5GR8vVXSYhXJ7w作者:黄卫兵.陈锦霞 一.Tomcat容器 9.0. ...

  7. 2D+1D | vivo官网Web 3D应用开发与实战

    一. 前言 1.1 前端工程师,不写网页,还能做什么? 在近20年的前端发展史中,前端经历了铁器时代(小前端),信息时代(大前端)以至现在的全能前端时代.经历了几个时代的沉淀之后,前端领域开始更加细分 ...

  8. JavaScript到底应不应该加分号?JavaScript自动插入分号规则详解

    JavaScript 提供了 automatic semicolon insertion (ASI)自动插入分号规则,在不加分号的情况下,会自动补充分号来分隔不同语句. 导致在继左大括号换行.tab ...

  9. 十一、docker的容器互联

    系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...

  10. 【调试】ftrace(三)trace-cmd和kernelshark

    之前使用ftrace的时候需要一系列的配置,使用起来有点繁琐,这里推荐一个ftrace的一个前端工具,它就是trace-cmd trace-cmd安装教程 安装trace-cmd及其依赖库 git c ...