发布于 

Android分析apk逆向系列WriteUp

前言

在学习安卓逆向的萌新SR绝赞刷题中,最近做了三道有意思的题目,感觉很适合入门,于是写了个wp发了出来

App1-分析

工具:JADX,安卓设备/虚拟机

安装并打开app,是一个简单的 输入-校验 式app

我们用JADX打开apk,看一下反编译代码

首先打开xml文件,这里写明了app启动时打开的Activity,确定是MainActivity后转到反编译代码处

如图,很容易确定代码逻辑——简单的异或操作
flag即为"versionName"的各个字符与"versionCode"进行异或操作的结果

跟进代码,找到需要的两个常量,写解题脚本

#include <cstdio>
 
int main()
{
    char str[] = "X<cP[?PHNB<P?aj";
    int num = 15;
    for(int i = 0; i < 15; i++)
    {
        printf("%c", str[i] ^ num);
    }
}

得到flag:W3l_T0_GAM3_0ne

本题结束

App2-分析

工具:JADX,安卓设备/虚拟机,IDA,adb

如同分析APP1一般,我们安装并打开APP2,同时使用JADX进行反编译

APP2界面上要求填写账号密码,但无论什么账号密码都有效,影响不大

对反编译代码进行分析,发现无论我们怎么输入,都会打开SecondActivity界面

同时发现代码中有一段校验

我们跟进加密方法,发现是个native方法,即利用JNI,调用写好在so文件中的函数

使用IDA打开so文件

从关键字AES_128_ECB_PKCS5Padding中即可知道加密方式
使用在线工具解密字符串,即可获得flag:“aimagetencent”

不过,得到的flag是错误的,我们继续分析代码

观察左侧的几个类,我们发现了第三个Activity:FileDataActivity

进入后发现存在使用了相同方式加密的字符串

解密后获得真正的flag:Cas3_0f_A_CAK3

提交后,考虑到我们在app中从未进入过FileDataActivity,决定打开这个Act一探究竟

使用adb自带的am命令(adb配置与连接的方法不多赘述)

am start -n com.tencent.testvuln/com.tencent.testvuln.FileDataActivity

手机app便跳转到了这个Activity,如图所示

使用这个方法,同样可以获得flag
本题结束

App3-分析

工具:JADX,DB Browser for SQLite,android-backup-extractor
题目文件是ab文件,即adb的备份文件,我们使用android-backup-extractor工具将其解压
压缩包内能找到apk文件和两个数据库文件
使用JADX打开apk,发现反编译出来的代码有点复杂
我们还是跟踪到MainActivity处进行分析

关键字demo.db告诉我们,要找的关键代码就在这里,简单阅读了下代码逻辑后得出以下结论:

程序对Strange123456字符串进行了一些操作,作为数据库的密码

至于进行了什么操作,我们慢慢分析

首先,调用了Cipher类的"mo6317a"函数(此处由JADX的反混淆功能生成,不同设备可能有所不同),该函数的作用是取两个字符串的前四个字符进行拼接
即"Stra1234"

然后以得到的字符串为参数,调用了Cipher类的"mo6318b"函数,跟踪过去发现,该函数进行了MD5和base16操作

最后,在加密结果的首部填上"Stra1234",以此为参数调用”mo6316a“函数,该函数的作用是:在参数尾部接上”yaphetshan“,进行SHA-1base16操作

得到结果的前八位即为数据库密码:ae56f99


上方两个图片为Cipher类及其调用的加密类的代码,可以对照查看

使用DB Browserd打开db文件,输入密码,得到flag

将其进行base64解密,拿到最终的flag:Tctf{H3ll0_Do_Y0u_Lov3_Tenc3nt!}
本题结束

link