论坛首页 安全编程开发区 阅读主题

[原创]用IDA微码(Hex-Rays Microcode)技术反简单CFF

449 浏览 14 回复
#1 楼主 2026-06-01 21:08:45
反简单的OLLVM CFF,一般有几大功能模块:许多定制修改、增强型OLLVM CFF,无法用上述方案简单搞掂,本小节只考虑基础情形。参看GhHei提到,IDA微码有个值域分析功能,对付基础情形时可用于e步骤。此功能有重大短板,许多非标准CFF非常复杂,值域分析不足以发现状态变量到有效块的映射,e步骤无法完全实施。D810插件比IDA内置的值域分析强一些,它用MicroCodeInterpreter模拟执行分发器逻辑,将指定状态变量值作为输入,看分发器会把控制流导向哪个有效块。bluerust曾想把MicroCodeInterpreter抠出来单独用,后来发现大量微指令未实现,要补的话,工作量不小,他没有动手。但D810这个框架很强大,有志于反CFF时,可认真学习借鉴。单靠IDA微码反CFF,基本是静态分析,有许多复杂情形处理不了。Angr符号执行比MicroCodeInterpreter强大,许多时候无需显式找出状态变量,直接模拟执行,建立Block到Block的映射关系,大致相当于c至f步骤一把梭。Angr不利之处,较重型。以前我只接触过D810、Angr,未接触过IDA内置的值域分析。看雪两篇给了使用此技术时的大多数工程细节,惟缺一个完整PoC。本小节提供完整PoC及小型测试样本,便于技术聚焦。测试样本是从原始样本抠取的,无法在实际环境中加载调试,但在IDA中测试反CFF足矣。完整测试用例打包在IDA 8.4.1/9.2中测试通过。样本so中的foo、bar、baz函数是目标函数。get_state_2_block_id_dict()中用到值域分析。上述代码只能对付简单的OLLVM CFF。作为反例,libgeiri.so中有许多函数非常复杂,上述代码对付不了。关于libgeiri.so,参看创建: 2025-11-11 16:07

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-289070.htm
#2 2026-06-01 21:08:45
标准的没什么难的  难的是编译器优化 把几个相同块优化成一个块 ida 微码的块复制非常反人类 再加上路径爆炸 自动化基本上搞不定 都需要人工参与 我选择看trace日志
#3 2026-06-01 21:08:45
学习
#4 2026-06-01 21:08:45
tql
#5 2026-06-01 21:08:45
good
#6 2026-06-01 21:08:45
学习
#7 2026-06-01 21:08:45
学习
#8 2026-06-01 21:08:45
学习中
#9 2026-06-01 21:08:45
学习
#10 2026-06-01 21:08:45
学习
#11 2026-06-01 21:08:45
学习
#12 2026-06-01 21:08:45
学习学习
#13 2026-06-01 21:08:45
学习一下
#14 2026-06-01 21:08:45
感谢分享
#15 2026-06-01 21:08:45
我也遇到了类似的问题,一些单纯用于改变寄存器值的链路会被微码块直接优化去掉,导致很多块找不到前序和后续无法串联

请登录后参与讨论

立即登录 注册账号