首页
社区
课程
招聘
[原创]符号执行去除BR指令混淆
发表于: 2024-3-1 16:44 22800

[原创]符号执行去除BR指令混淆

2024-3-1 16:44
22800

    直接进入正题,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该条件位置,强行进行符号设置即可

        这个应该是最简单的一块了直接展示代码


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2024-3-1 18:27 被大帅锅编辑 ,原因:
上传的附件:
收藏
免费 17
支持
分享
最新回复 (11)
雪    币: 1229
活跃值: (1760)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享tql
2024-3-1 17:34
0
雪    币: 3004
活跃值: (30861)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2024-3-4 10:52
1
雪    币: 2328
活跃值: (10364)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
66666
2024-3-4 15:03
0
雪    币: 886
活跃值: (2310)
能力值: ( LV4,RANK:52 )
在线值:
发帖
回帖
粉丝
5
tql
2024-3-6 10:51
0
雪    币: 8530
活跃值: (6628)
能力值: ( LV12,RANK:449 )
在线值:
发帖
回帖
粉丝
6

太强了

最后于 2024-3-6 12:39 被Tokameine编辑 ,原因:
2024-3-6 12:39
0
雪    币: 76
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
还是帅锅
2024-3-21 18:22
0
雪    币: 1
活跃值: (485)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8

我透過IDA pro打開 lib52pojie.so 使用jump to Address可以得知 start_addr = 0x1A864 就是 JNI_OnLoad

版主我想請問  end_addr = 0x1AE20 是怎麼計算得來的???


感謝版主分享優質文章


最后于 2024-4-7 20:13 被飆汗吉米编辑 ,原因: 問題沒有敘述清楚
2024-4-7 20:07
0
雪    币: 16501
活跃值: (6382)
能力值: ( LV13,RANK:923 )
在线值:
发帖
回帖
粉丝
9
飆汗吉米 我透過IDA pro打開 lib52pojie.so 使用jump to Address可以得知 start_addr =&am ...

这种很明显就是函数的结尾

2024-4-8 10:21
1
雪    币: 1
活跃值: (485)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10

謝謝版主
我以為0x1AE20 是另一個函數的開始,0x1AE1C才是JNI_OnLoad的結束。
我對IDApro不夠熟悉再回去多讀點書

最后于 2024-4-8 11:05 被飆汗吉米编辑 ,原因:
2024-4-8 11:01
0
雪    币: 136
活跃值: (1465)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
11
tql
2024-4-24 17:19
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
符号执行yyds
2024-4-27 11:34
0
游客
登录 | 注册 方可回帖
返回
//