直接进入正题,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该条件位置,强行进行符号设置即可 这个应该是最简单的一块了直接展示代码
回复或点赞可查看完整内容
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-280737.htm
[原创]符号执行去除BR指令混淆
99 浏览
19 回复
符号执行yyds
学习了
tql
tql
tql
tks
大佬牛皮
好的!
tqlll
牛的
感谢分享tql
tql
謝謝版主
我以為0x1AE20 是另一個函數的開始,0x1AE1C才是JNI_OnLoad的結束。
我對IDApro不夠熟悉再回去多讀點書
最后于 2024-4-8 11:05
被飆汗吉米编辑
,原因:
我以為0x1AE20 是另一個函數的開始,0x1AE1C才是JNI_OnLoad的結束。
我對IDApro不夠熟悉再回去多讀點書
最后于 2024-4-8 11:05
被飆汗吉米编辑
,原因:
飆汗吉米
我透過IDA pro打開 lib52pojie.so 使用jump to Address可以得知 start_addr =&am ...
这种很明显就是函数的结尾
我透過IDA pro打開 lib52pojie.so 使用jump to Address可以得知 start_addr =&am ...
这种很明显就是函数的结尾
我透過IDA pro打開 lib52pojie.so 使用jump to Address可以得知 start_addr = 0x1A864 就是 JNI_OnLoad版主我想請問 end_addr = 0x1AE20 是怎麼計算得來的???
感謝版主分享優質文章
最后于 2024-4-7 20:13
被飆汗吉米编辑
,原因: 問題沒有敘述清楚
感謝版主分享優質文章
最后于 2024-4-7 20:13
被飆汗吉米编辑
,原因: 問題沒有敘述清楚