首页
社区
课程
招聘
[原创]使用ida trace来还原ollvm混淆的非标准算法
发表于: 2021-1-5 23:48 12924

[原创]使用ida trace来还原ollvm混淆的非标准算法

2021-1-5 23:48
12924

这是3W班9月的题目。


题目使用ollvm混淆算法。

通过题目我掌握了IDA trace的使用方法,并灵活使用frida及调试等方式来获得中间状态来完成题目。

但是对常见算法不够熟悉,导致恢复了整个base64。这个工作量实际是可以省下的。


先拖进IDA看看,不是能简单逆向出来的。先上trace

 

拿到tracelog后,尝试从输出往前找。本次的输入输出如下:

按输出的字符搜索,经过几次尝试后,可定位到sub_7F0FA11764:loc_7F0FA1198C行就是生成输出的指令。和输出是完全一样的。

先看一下output[0]是怎么计算的。

分以下3步:

1、从一个0000007F0FA39010地址中的0x15偏移中取出一会字节。我直接静态看这个地址的值与取出的值是不对的,观察了init array,发现有大量的解密操作,估计在里面做了解密,我动态调了一下,得到0000007F0FA39010这个数组的值为:0123456789-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,此时值可以对应上了。

20x15的的计算是0x55>>2得到。

3、而0x55是从0000007F0F7CFDA0地址的0偏移中取出。0000007F0F7CFDA0暂时不知道是什么,暂称为middle数组。


为了便于计算,需要先得到这个middle数组的值,这个用trace不大好看,我在IDA中二进制逆向跟踪一下。其实就是sub_F04C的第一个参数a1

大概看一下整体的流程,在Java_com_kanxue_ollvm_1ndk_MainActivity_UUIDCheckSum这个函数中,input经过sub_1029c函数,生成v19。而v19就是一直透传到sub_F04C函数的a1

为了证明sub_F9B8v19的值与sub_F04C的值是一样的,我写frida脚本hook一下并打印内存,确实是一样的。

因此整个流程就比较清楚了,input处理成middle,再处理成output

第一次trace没有把这个参数记录下来,为了能更好地验证,再trace一次,并且写一个frida脚本,把这个a1地址的值取出来 。

脚本关键部分如下:

这次有input, middle,以及output的值了。

仍然从后往前恢复,先把middle转换成output部分恢复了。

发现这部分有4个规律,分别按模4,按余数为0123来处理。其中为0部分上面已经大概恢复了。这4个规律大同小异,按trace来恢复就行了,不一一细讲,其中对middle下标的处理有点小trick,我被卡了一下。

sub_F04C的伪码其实可看出来,每次index是加3的。



[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 3419
活跃值: (2109)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
mark. 跟大神学习
2021-1-7 20:20
0
雪    币: 10944
活跃值: (7329)
能力值: ( LV12,RANK:219 )
在线值:
发帖
回帖
粉丝
3

去混淆之后,算法还是挺明显的

2021-11-5 17:06
0
雪    币: 736
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
neilwu 去混淆之后,算法还是挺明显的
你这个怎么去除混淆的?
2023-1-13 15:06
0
游客
登录 | 注册 方可回帖
返回
//