观察是否有壳
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240924193006102.png)
直接从oncreate()开始
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240924192338248.png)
调用系统函数加载so库
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240924192411112.png)
接下来用IDA逆向对应的so层,首先直接crtl+f直接搜索java_come_xxx,
顺利找到,开始分析(以下步骤均通过静态+动态调试进行):
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926112908498.png)
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926112920263.png)
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926112944956.png)
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926113006770.png)
线索一
我们要输入的字符串长度为38位,且前5位为"flag{",最后一位为“}”,而中间是32位进行下一步分析
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926113309318.png)
接着经过check1()函数处理
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926113352738.png)
跟进去进一步查看
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926114733384.png)
这里用的是arm64-v8架构进行逆向,倘若用armabi-v7架构将会有更明显的特征
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926115004141.png)
push_back 调用中,(unsigned __int8)(*(_BYTE *)(v14 + i) & 0xF0) + (v15 & 0xF) 和 push_back(v3 + 9, (unsigned __int8)(*(_BYTE *)(v17 + i) & 0xF0) + v18) 分别将高四位和低四位组合在一起
举个例子
假设一个32位的二进制数为 A B C D E F G H I J K L M N O P,其中:
其中:
[ol]
[/ol]
结果可能是这样的:
线索二
check()函数将前十六位的高四位和后十六位的低四位组合存放到后十六位,将后十六位的高四位和前十六位的低四位组合存放到前十六位。
重新分组后进入如下算法:
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926115545669.png)
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926115646405.png)
线索三
这里将字符串分为4组进行TEA加密,注意key这里运行时候被修改了,正确的应该是0x42,0x37,0x2c,0x21
接着分析:
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926115813150.png)
进入了一个类似base64加密函数进行加密,跟进查看
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926120526232.png)
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926120605096.png)
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926120628875.png)
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926120648134.png)
线索四
*值得注意的是base64_encode中不止包括了base64加密,还有移位操作。将编码之后的base64,每三位循环向左移动,第四位做分隔符不变.并且通过动态调试发现base64的表为`abcdefghijklmnopqrstuvwxyz!@#$%^&()ABCDEFGHIJKLMNOPQRSTUVWXYZ+/`**
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926120829345.png)
比较
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926121045256.png)
代码编写
综合以上知识,开始编写逆向代码:
首先编写TEA算法的C语言库以供python调用:
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926165122329.png)
其次主要逆向脚本如下:
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926165214669.png)
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926165300508.png)
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926170412022.png)
最终结果如下:
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926170428912.png)
验证
![](https://cdn.jsdelivr.net/gh/wangxiaobai08/Picture@main/image-20240926170553321.png)
题目及脚本
通过网盘分享的文件:easy-app.zip
链接: https://pan.baidu.com/s/1E6-WtYpF1f0hiW01S_kO3w?pwd=uj1r 提取码: uj1r