LyScript 验证PE程序开启的保护

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

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

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

posted @ 2022-08-03 15:11  lyshark  阅读(243)  评论(0编辑  收藏  举报

loading... | loading...
博客园 - 开发者的网上家园