第二届网鼎杯青龙组部分题目Writeup
Reverse bang
考点:梆梆加固脱壳
加固特征分析
apktools 加载工程后,部分文件丢失(灰色)。smail 代码只有 SecShell 类;lib 中发现 libSecShell.so ,结合最新各大apk加固特征库和吾爱帖子推测应该是梆梆加固免费版。
梆梆加固会隐藏源码,然后在 com 中加载 libSecShell.so ,来运行程序。
1 | System.loadLibrary("SecShell"); |
程序脱壳
脱壳过程一直踩坑,各种环境问题而出错。
准备使用DexExtractor来脱壳的,但是 AS ADV arm架构机器一直报错运行不起来。失败记录独立成篇,跪求大佬指导。
选择使用 xposed + apkshelling 模块脱壳,脱壳原理移步作者 github 。
编译apkshelling
apkshelling 会匹配是否目标包名及是否加壳,是的话就脱壳。但稳妥起见将目标 apk 的包名填入到 apkshelling 源码中的 XposedEntry 。
编译生成 apk ,安装到虚拟器中,在 xpoesed 中激活启用,重启虚拟机。
apk 源码中有 activity 需要编译成无桌面图标的。如果要编译无桌面图标 apk 看这里:
[collapse title=”展开查看详情” status=”false”]
launch 选择 Nothing。
或者需注释掉xml 里面的 APP 入口Activity中的下面这句即可:
1 | <category android:name="android.intent.category.LAUNCHER" /> |
[/collapse]
dump dex
重启后安装&运行题目的 apk。查看 xpoesed 日志看看有没有 dump 到dex :
1 | adb logcat -s Xposed |
成功 dump 会有类似 log :
1 | I/Xposed ( 2450): Load package: com.example.how_debug |
dex 会被 dump 到/data/data/包名
。
逆向找flag
把 dex 拖到本机:
1 | adb pull /data/data/com.example.how_debug/00081-02.dex ./ |
dump 出来的 dex 文件,使用 jeb 打开,也可以选择 jadx 。
dump 出来的 4 个 dex 只有一个是程序源码,挨个找一下(com.example.how_debug)就行。
打开后就能找到 flag :
碎碎念
搜罗一下发现 FART 好像也可以脱这个壳,但相比于 apkshelling 能力比较弱,具体对比&安装&使用,看这里:ApkShelling脱壳和FART脱壳。
实在太菜 DexExtractor 环境部署不来。
Reverse signal
源码分析
程序要求输入一串字符,前面有一个校验长度是否为 15 。检验通过后会进入下面这个伪虚拟机的加密函数里面。操作的指令存放在 a1 ,加密的 flag 也在 a1 。
1 | int __cdecl vm_operad(int *a1, int a2) |
执行的指令如下:
1 | 读入明文 |
1 是将明文加密后的字符赋值到 v4 ,用于最后校验密文。
思路
每个字符加密操作,没有用到迭代的中间变量,所以 a1 中的密文提取出来,然后按照各个字符逐个解密:
1 | m1=(c[0]+5)^0x10 |
最后结果:
1 | 757515121f3d478 |
事后发觉如果每个字符都是单独加密的,没有迭代的。可以试试把每一个密码的所有明文对应的密文爆破出来,然后就只需要挑出来对应的明文即可。ascii 可见字符应该是 95 个,每一轮的输入 15 个相同 明文,然后提取加密的字符串,可以实现的。
听群里老师傅能用 angr
秒。