SCTF2024-re-wp
BBox
SO层算法
注意,不同平台的
rand()不一样,一定要在linux的环境跑伪随机数
1 | // so层算法的流程和逆向 |
JAVA 层去混淆
strange.encode() 方法被上了混淆,函数名字和变量名字被改成了奇奇怪怪的unicode字符降低可读性,可以rename一下,把非法字符给重命名一下

可以看到 v14 控制着程序的控制流,存在两种混淆

需要一些 smail 语法知识,先放一篇链接
执行另一个类的
hashCode函数获得对应的值,这个函数 JEB 5.0 以上且 windows 版本 (为什么有限定呢,因为和一位师傅测过 mac 版不行) 是可以自动帮我们处理的

寻找另一个
Class里的某个变量
这个变量是
public static int类型,从而欺骗JEB没法直接计算这个变量的值从而去混淆,因此一个思路就是把这个变量添加final修饰符,即改为public static final int型,这样变量变为只读,就自动被JEB优化掉了
此外在计算
v14的时候使用的是sget指令寻找这个变量的,那么第二种去混淆的方式就是修改sget指令为const指令,也能达到同样的效果
这里我们考虑把所有的 sget 都改成 const_16 指令,使用 JEB 脚本搭配 dexlib2 库实现
JEB2 文档:IDalvikInstruction | JEB API Documentation (pnfsoftware.com)
dexlib2 手册:Overview (dexlib2 2.5.2 API) (javadoc.io)
思路如下:
- 导入 dex 文件,遍历所有 dex 文件的
field字段,然后筛选出被混淆后的非法变量名,建立变量名 -> 值的映射方便后续处理 - 找到目标类
strage类,遍历里面的所有方法以及每个方法的每个指令,找到所有SGET指令替换成CONST指令 - 新建一个 dex 文件,保存 patch 过后的文件信息生成新的 dex 文件
JEB 脚本环境搭建
这里用IDEA maven搭建环境

创建完成后添加 src 文件夹,然后配置依赖
1 | <dependency> |
关键去混淆逻辑如下
1 | package com.epsilon; |
去混淆后再把 dex 文件通过 MT 管理器丢到 apk 包里,再用JEB反编译就能去混淆,前面 base64 后面一个 xor 结束

loginDemo
JEB 直接解密字符串,然后JAVA层就直接看干净了,输入用户名密码,一通操作以后生成一个 secretKey,再进 generateSignature(就是一个base)然后发包,题目提供了一个 har 文件,找个在线网站打开即可 HAR File Viewer | Analyze HTTP Archive Files Online Free (jam.dev)


写个 frida 脚本 hook 一下
1 | setImmediate(function() { |
结合一些输入和算法特征,能看出 SO 里面的 getNothing 是个 RSA,p和 q 连在一起了,但是可以看出其长度都是 309,手动切分一下


然后通过反射方法执行了另一个 dex 里面的 say_hello 函数,异或了一个密钥生成了 secretKey,再连接上一串固定字符用 base64 编码发包
1 | import base64 |
UDS
修一下内存,关键逻辑在这儿

先进TEA,密钥是

密文是

然后解出来是 RC4的密钥

运行一个RC4解密,密文获得需要复现main前面的初始化函数


1 | import idaapi |
密文如下

解密即可


