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 |
密文如下
解密即可