-
-
[原创]符号执行去除BR指令混淆
-
发表于:
2024-3-1 16:44
22801
-
直接进入正题,BR指令的混淆,该指令完全打断了IDA的反编译流程,导致我们无法看见看清反编译流程,一般的BR指令后续都紧跟两个跳转地址具体原理如下图所示
理清出了原理,那我们怎么去除了,这里我们选择的用miasm(东西是好东西,但是资料基本没有)符号执行去除,符号执行的优点在于它到未生成ir块和不确定的分支的时候会自己停止如下图所示,利用该特点我们只需要进行树的遍历即可探索出"基本所有分支"
生成的下次跳转地址,就是下面这个表达式
该表达式其实是Miasm中的ExprCond表达式,因此我们只需要解析出ExprCond表达式即可,通过阅读miasm源码我们可知
src1和src2就是我们想要的 @64[0x545B0] + 0xFFFFFFFFF775B348和@64[0x54558] + 0xFFFFFFFFF775B348,因此通过如下方式
可获取到下次跳转到地址。
得到地址后,我们就需要对pc值和irdst值进行hook修改,如修改成@64[0x545B0] + 0xFFFFFFFFF775B348,这样树就会向左下方进行遍历,但是需要注意的是miasm的SymbolicExecutionEngine并不具备指令hook的功能,因此我们需要阅读源码进行特定式修改,通过阅读miasm源码我们发现在SymbolicExecutionEngine中的eval_updt_irblock
进行了指令的解析和执行,因此我们只需重写该方法即可
但是事情没有我们想象的那么简单,当我们把pc hook修改为特定的值的时候,符号引擎并没有像我们想象中的继续向下执行如下图所示
通过阅读miasm源码发现地址不在ircfg的block中导致的(如下图所示)
解决方式也很简单,直接向asmcfg中添加即可
在实际的分支遍历中我们遇到有些分支产生的下一个地址始终是常量(ExprInt),正常的情况应该产生ExprCond表达式才对,产生这个原因可能是需要满足某种循环后才会产生ExprCond表达式。解决方式也很简单,先通过br指令我们先遍历出所有条件设置指令如csel指令如下图所示
然后我们hook该条件位置,强行进行符号设置即可
这个应该是最简单的一块了直接展示代码
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2024-3-1 18:27
被大帅锅编辑
,原因: