首页
社区
课程
招聘
[原创]ollvm算法还原案例分享
发表于: 2020-7-13 14:55 10768

[原创]ollvm算法还原案例分享

2020-7-13 14:55
10768

样本来自看雪3W班5月题
本题主要是还原so的算法函数,关键算法函数很好定位,主要还原方法是frida+ida调试+ida trace
1、找到对应产生结果的函数public native byte[] e(byte[] arg1)

2、固定入参,打印参数

得到结果:

3、ida打开对应so,找到jbyteArray __fastcall Java_com_kanxue_ollvm5_MainActivity_e(JNIEnv *env_, __int64 a2, jbyteArray ary)
函数,hook发现sub_184EC调用三次,其中第三次的arg1为结果函数

查找sub_184EC引用,找到函数sub_13CE4

4、hook sub_184EC, 根据结果可知参数类型, 第2个参数是input,第5个参数是ouput, 即sub_184EC为关键算法函数

frida写一个主动调用,trace一下

从trace的结果来看只看到input没看到output
再返回仔细看,尝试hook sub_13808试试

一步一步调试,发现第一轮最先生成的是

然后才生成结果

根据trace + 第一轮生成结果比对 还原出最终算法代码如下


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-7-20 14:55 被咸鱼炒白菜编辑 ,原因:
收藏
免费 6
支持
分享
最新回复 (11)
雪    币: 2971
活跃值: (117422)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发! 感谢分享~
2020-7-13 15:03
0
雪    币: 1392
活跃值: (1467)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
Youlor 沙发! 感谢分享~
脱壳的大佬
2020-7-13 15:04
0
雪    币: 4883
活跃值: (18890)
能力值: ( LV13,RANK:317 )
在线值:
发帖
回帖
粉丝
4
感谢分享~
2020-7-14 16:15
0
雪    币: 739
活跃值: (1865)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
菜菜棒棒棒
2020-7-15 13:25
0
雪    币: 1640
活跃值: (1719)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
大佬,有个问题请教一下,第三步的时候,查找sub_184EC引用,找到函数sub_13CE4,单纯知道sub_184EC调用了三次,怎么确定第三次的调用位置呢?
2020-7-17 11:13
0
雪    币: 519
活跃值: (218)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
菜年richor 大佬,有个问题请教一下,第三步的时候,查找sub_184EC引用,找到函数sub_13CE4,单纯知道sub_184EC调用了三次,怎么确定第三次的调用位置呢?
用frida打堆栈
console.log("Backtracer" + ' called from:\n' +
Thread.backtrace(this.context, Backtracer.ACCURATE)
    .map(DebugSymbol.fromAddress).join('\n') + '\n');
2020-7-17 14:26
0
雪    币: 199
活跃值: (926)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
梨子 菜菜棒棒棒[em_86]
捕获梨子酱 (๑•̀ㅂ•́)
2020-7-17 14:39
0
雪    币: 19
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
感谢分享
2020-7-17 14:47
0
雪    币: 1640
活跃值: (1719)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢大佬
2020-7-17 15:19
0
雪    币: 118
活跃值: (81)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
感谢分享。实测有用
2020-7-18 16:41
0
雪    币: 196
活跃值: (5906)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
12
分析被ollvm混淆的算法思路就是找到参数被加密的过程以及结果的生成过程,frida的Thread.backtrace得到调用栈可以快速分析出参数的加密过程,再结合ida trace可以分析出参数被加密的具体算法。trace日志太大的时候,参数加密过程比较多,可以从trace日志中找返回结果的生成过程,来定位到具体算法的地址。
2020-7-22 17:16
2
游客
登录 | 注册 方可回帖
返回
//