好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 dannyf 于 2025-3-15 10:03 编辑
某国外安全公司安卓逆向基础岗位的面试CTF真题,给一apk,找flag。成功找到。特地分享交流一下
思考步骤:
1. 拿到apk后,模拟器安装跑起来看看UI。UI里三个界面。界面过于简洁,都只有一行文字Where is the flag,没有任何思路上的提示。
2. 使用JADX逆向查看代码,明文搜索Android_CTF无结果。包括strings.xml,layout.xml好像没有发现什么线索。
3. 使用Ghidra逆向查看lib中带有的.so,明文搜索Android_CTF无结果。
4. 在JADX里过了一下逆向的各个类,感觉好像不少是Android Material Design和flag不相关的东西。而且很多类名变量名似乎是被混淆了,只有简单的一个字母(类a,b,c,d,e)
5. 唯一引起注意的是NotificationsFragment。这个类有native方法加载了名叫fragment的.so的原生库。这应该不是安卓开发里的那个fragment库吧?然后最关键的是这个NotificationsFragment引入了javax.crypto这个包,并且有一些AES加密解密的操作。Flag应该在这部分代码。
6. 想动态调试一下这个app,该app在Android Studio的安卓模拟器里(未root,未安装任何逆向工具,安卓15)能正常运行显示UI。在root并且安装了Xposed的雷电9模拟器(安卓9)里直接闪退。拦截闪退后发现并不是开发者检测root调用退出函数,是捕获到了异常。异常在MainActivity.onCreate抛出Failed resolution of: Landroid/window/OnBackInvokedCallback;。查询安卓官方文档后发现这是一个安卓13才引入的方法。马上看了下app的AndroidManifest原来最低支持安卓13....
7. 随后放弃了雷电模拟器,改用AVD,使用https://github.com/newbit1/rootAVD脚本root掉AVD,自带面具。然后在国外论坛找到最新版的JEB Pro,adb跑起来程序然后JEB上attach上动态调试
8. String s = NotificationsFragment.Fragment("15539863");这部分应该是调用了一个native库,返回的值是TheFlag。说明线索在.so的native库里?
9. 继续排查,线索不在.so文件里,里面主要就硬编码了一个东西,和传入的值做异或。结果传出来给就是上面那个字串,这个字符串仅用于使用AES解密的时候当作密钥
10. 直接最后解密出来的结果,就包含了flag
以上
|
|