首页
社区
课程
招聘
第六题 Ericky-apk Writeup
2017-6-12 23:18 3134

第六题 Ericky-apk Writeup

2017-6-12 23:18
3134

  这道题算法较为简单,但java层和so层都加了混淆,对分析有些影响。

  首先看java层。用JEB反编译apk文件会发现,MainActivity中许多变量都被一些非常长的标点符号组成的变量名替换了。不过JEB可以重命名变量名,将相应变量名重命名后代码就比较清晰,如下图所示。

  代码的含义就是获取输入框的内容并将它传递给utils.check函数进行判断,如果判断结果为真则成功,否则失败。utils.check函数内容如下。

  其本意就是加载一个so文件然后调用其导出函数check对输入进行判断。从apk解包的文件中可以找到名为librf-chen.so的文件。

  接下来是对so文件的调试。用ida附加apk调试时发现无法附加,因此选择使用调试模式启动程序,之后用ida附加进行调试。命令如下:

adb shell am start -D -n com.miss.rfchen/com.miss.rfchen.MainActivity

  进入so文件中,发现onload函数中调用了ptrace,应该是用于阻止附加调试,之前无法附加调试的原因应该就在这。

  过掉这一步后在check函数下断,输入文本进入check函数。函数中通过如下图的多次跳转进行混淆,影响分析。不过由于主要算法处理函数特征较为相似,所以容易由某个函数推出所有函数。

  第一步的算法是对输入内容的每一位与一个表进行异或操作。每一位的异或都由一个函数进行,但每个函数特征相同,在第一个函数中会判断输入长度,超过7位才为合法输入(len>>3>0)。下面选取一个函数进行说明。

  如果当前进行异或的字符是输入内容的第n位的ascii码,则首先以n作为偏移查找表中的值,表中的每一位以四字节为间隔存储。之后将查找到的值与表中上一位输入对应偏移位置未修改前的内容进行相加(因为每一步都会对当前位在表中对应的位置的值进行修改)。之后会查找表偏移上一步相加的和的值,并以第一步查找到的值互换位置,最后取表偏移这两个位置值之和的值作为索引查找最终要异或的值,之后进行异或操作。(ps:这里应该是rc4,当时没有看出来。。)

  这段操作看起来十分复杂,但不难发现,所有的操作都只在表中进行,而未与当前位置的值挂钩。也就是说,和每一位异或的值都是固定的。

  异或结束之后会得到一串由字符ascii码组成的长字符串,这串字符串会在函数sub_5afc中进行下一步运算。sub_5afc函数就是对输入字符进行base64编码。

  之后会那计算得到的base64编码字符串与程序生成的一串固定的base64字符串进行对比,如果两者相等则成功,否则失败。

  这串固定的base64编码为JPyjup3eCyJjlkV6DmSmGHQ=,解码后得24fca3ba9dde0b226396457a0e64a61874(共17个字节)。而之前异或使用的表内容(前17字节)为49 9d c7 df ff a7 6e 50 0A f5 2E 03 37 50 93 2a 4c(这个可以跟踪每一个运算函数获得,也可以输入样例,例如a-z获得)。再一次异或可得输入的ascii码为6d 61 64 65 62 79 65 72 69 63 6b 79 39 34 35 32 38,对应字符串为“madebyericky94528”。





[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回