• LyScript 验证PE程序开启的保护


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

    LyScript项目地址:https://github.com/lyshark/LyScript

    验证PE保护方式: 验证自身保护方式无需要遍历加载过的模块,读入DllCharacteristics并依次与操作数与运算得到主程序的保护方式。

    1. from LyScript32 import MyDebug
    2. import pefile
    3. if __name__ == "__main__":
    4. # 初始化
    5. dbg = MyDebug()
    6. dbg.connect()
    7. # 根据text节得到程序首地址
    8. base = dbg.get_base_from_address(dbg.get_local_base())
    9. byte_array = bytearray()
    10. for index in range(0,4096):
    11. read_byte = dbg.read_memory_byte(base + index)
    12. byte_array.append(read_byte)
    13. oPE = pefile.PE(data = byte_array)
    14. # 随机基址 => hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x40 == 0x40
    15. if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 64) == 64):
    16. print("基址随机化: True")
    17. else:
    18. print("基址随机化: False")
    19. # 数据不可执行 DEP => hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x100 == 0x100
    20. if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 256) == 256):
    21. print("DEP保护状态: True")
    22. else:
    23. print("DEP保护状态: False")
    24. # 强制完整性=> hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x80 == 0x80
    25. if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 128) == 128):
    26. print("强制完整性: True")
    27. else:
    28. print("强制完整性: False")
    29. if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 1024) == 1024):
    30. print("SEH异常保护: True")
    31. else:
    32. print("SEH异常保护: False")
    33. dbg.close()

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

    如果需要验证当前程序加载的所有模块,则可以通过dbg.get_all_module()遍历加载过的模块,并依次读入DllCharacteristics与操作数进行与运算得到保护方式。

    1. from LyScript32 import MyDebug
    2. import pefile
    3. if __name__ == "__main__":
    4. # 初始化
    5. dbg = MyDebug()
    6. dbg.connect()
    7. # 得到所有加载过的模块
    8. module_list = dbg.get_all_module()
    9. print("-" * 100)
    10. print("模块名 \t\t\t 基址随机化 \t\t DEP保护 \t\t 强制完整性 \t\t SEH异常保护 \t\t")
    11. print("-" * 100)
    12. for module_index in module_list:
    13. print("{:15}\t\t".format(module_index.get("name")),end="")
    14. # 依次读入程序所载入的模块
    15. byte_array = bytearray()
    16. for index in range(0, 4096):
    17. read_byte = dbg.read_memory_byte(module_index.get("base") + index)
    18. byte_array.append(read_byte)
    19. oPE = pefile.PE(data=byte_array)
    20. # 随机基址 => hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x40 == 0x40
    21. if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 64) == 64):
    22. print("True\t\t\t",end="")
    23. else:
    24. print("False\t\t\t",end="")
    25. # 数据不可执行 DEP => hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x100 == 0x100
    26. if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 256) == 256):
    27. print("True\t\t\t",end="")
    28. else:
    29. print("False\t\t\t",end="")
    30. # 强制完整性=> hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x80 == 0x80
    31. if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 128) == 128):
    32. print("True\t\t\t",end="")
    33. else:
    34. print("False\t\t\t",end="")
    35. if ((oPE.OPTIONAL_HEADER.DllCharacteristics & 1024) == 1024):
    36. print("True\t\t\t",end="")
    37. else:
    38. print("False\t\t\t",end="")
    39. print()
    40. dbg.close()

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

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

  • 相关阅读:
    计算机的存储器(详解)
    #775 Div.1 C. Tyler and Strings 组合数学
    【Hadoop大数据技术】——HDFS分布式文件系统(学习笔记)
    Meta Q2财报:营收首次下滑,Metaverse将与苹果竞争
    Python3 安装 Matplotlib 报错 pip 无法卸载 pillow 解决方案
    22-06-28 西安 redis(02) 持久化机制、入门使用、事务控制、主从复制机制
    redis---非关系型数据库
    外汇天眼:美国9月份新屋开工数再次下降!美联储加息的影响越来越大
    用html编写的简易新闻页面
    文心一言(ERNIE Bot)初体验
  • 原文地址:https://blog.csdn.net/lyshark_csdn/article/details/126141857