Android逆向学习

这是TG:HACK2020的一道比赛题目
题目给的hint很误导人…反正我没看出来

Hint
Random title?

这是题目描述:Someone found this very old game lying around. Apparently there is an extremely funny joke in there somewhere.

之前没怎么做过安卓题目,所以这次真是学到了很多
题目的名字叫Bad intentions
上Google搜索之后发现是一堆歌曲,好吧这肯定跟题目没啥关系
当搜索apk intentions的时候就出现了有用的信息:
google搜索结果

所谓的apk intentions就是指这个程序能不能被外部访问,或者进行数据交换

Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动 作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的 交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。

然后就是如何查看这个apk包中有没有调用intent这个类了
aapt dump xmltree gaiainvaders.apk AndroidManifest.xml

aapt即Android Asset Packaging Tool,在SDK的build-tools目录下。该工具可以查看,创建, 更新ZIP格式的文档附件(zip, jar, apk)。

关于AndroidManifest.xml这个文件的介绍点这

就会输出如下信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
E: activity (line=19)  
A:android:name(0x01010003)="no.tghack.gaiainvaders.GaiaInvadersActivity" (Raw: "no.tghack.gaiainvaders.GaiaInvadersActivity")
E: intent-filter (line=20)
E: action (line=21)
A: android:name(0x01010003)="android.intent.action.MAIN" (Raw: "android.intent.action.MAIN")
E: category (line=23)
A: android:name(0x01010003)="android.intent.category.LAUNCHER" (Raw: "android.intent.category.LAUNCHER")
E: activity (line=26)
A: android:name(0x01010003)="no.tghack.gaiainvaders.JokeActivity" (Raw: "no.tghack.gaiainvaders.JokeActivity")
E: intent-filter (line=27)
E: action (line=28)
A: android:name(0x01010003)="android.intent.action.MAIN" (Raw: "android.intent.action.MAIN")
E: category (line=30)
A: android:name(0x01010003)="android.intent.category.LAUNCHER" (Raw: "android.intent.category.LAUNCHER")

可以看出了是调用了intent类的,而且发现一个JokeActivity的类。联想到题目描述觉得应该是这个文件了,用jeb打开看一下(我当时做这道题的时候没想到这,被其他地方误导了)

这是JokeActivity方法,我当时被这个给迷惑了…

到这可以看出来是个AES加密,写出脚本就可以跑出来了(大概,我没试)
还有一种更简单的方法
学习一下
上述提到了intent这个包,它是对于Android程序安全性相关性很大的包,有了它之后我们就可以对这个APK进行调试
adb install gaiainvaders.apk

adb全称Android Debug Bridge,是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。说直白一点就是通过adb可以实现用命令行控制设备。

使用adb有两种方法

  1. 需要安装安卓手机模拟器,这里我选择了网易的mumu模拟器,安装之后在platform-tools下运行adb程序
    adb connect 127.0.0.1:7555
    每个模拟器默认的端口不一样,具体的看这
    等它显示success之后就表示连接上了,之后执行安装命令就好了
  2. 用安卓手机之间连接,手机进入开发者模式,cmd中输入
    adb devices
    之后就安装就可以了

然后我们只需要运行JokeActivity这个类就能得到flag了,这里用
adb shell am start -n "no.tghack.gaiainvaders/.JokeActivity"

在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am.

启动的方法为

adb shell am start -n {包(package)名}/{包名}.{活动(activity)名称}

然后就得到了flag