LyScript 验证PE程序开启的保护

简介: 有些漏洞利用代码需要在某个保护模式被关闭的情况下才可以利用成功,在此之前需要得到程序开启了何种保护方式。验证其实有很多方法,其原理是读入PE文件头部结构,找到`OPTIONAL_HEADER.DllCharacteristics`结构,通过与不同的操作数与运算得到,LyScript插件完全可以实现这个验证功能,实现起来也是很简单的。

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

程序运行后即可输出,当前主程序内启用了何种保护方式:

image.png

如果需要验证当前程序加载的所有模块,则可以通过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()

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

image.png

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

目录
相关文章
|
10月前
|
网络安全
SNETCracker.exe 2022/1/26 31:13:29----检查12.26.20.1:SSH登录发生异常!未能加载文件或程序集“ChilkatDotNet4.dll”或它的某一个依赖项
SNETCracker.exe 2022/1/26 31:13:29----检查12.26.20.1:SSH登录发生异常!未能加载文件或程序集“ChilkatDotNet4.dll”或它的某一个依赖项
317 0
|
前端开发 测试技术
clswindow使用案例:防止vb程序重复打开,如果重复打开则激活当前已经打开的程序
clswindow使用案例:防止vb程序重复打开,如果重复打开则激活当前已经打开的程序
260 0
clswindow使用案例:防止vb程序重复打开,如果重复打开则激活当前已经打开的程序
|
存储 安全 小程序
PE格式:手工给程序插入ShellCode
PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密,病毒分析,外挂技术等,本次实验的目标是手工修改或增加节区,并给特定可执行程序插入一段ShellCode代码,实现程序运行自动反弹一个Shell会话。
383 0
PE格式:手工给程序插入ShellCode
关于 Qt在win上“启动程序失败,路径或者权限错误"无法运行的16位程序 的解决方法
关于 Qt在win上“启动程序失败,路径或者权限错误"无法运行的16位程序 的解决方法
关于 Qt在win上“启动程序失败,路径或者权限错误"无法运行的16位程序 的解决方法
slmgr激活提示执行slui 0x2a 0xC004E015
slmgr激活提示执行slui 0x2a 0xC004E015
2595 0
单独编译工模&push替换烧写
[‎2017/‎8/‎16 14:47] 吴成兵: 这些都87工模测试的代码吗 [‎2017/‎8/‎16 15:00] 吴成兵: 单编工模代码是make system吗 [‎2017/‎8/‎16 15:23] 牛小燕: 单编是在 package/app/midtes...
1074 0