CTF安卓逆向练习第二弹–代码注入
写在前面的话:这次练习的题目是阿里ctf2014年的第一题,题目比较简单,涉及的知识点也比较少,但是这次用了代码注入的方式进行解题,刚好可以对这种逆向方法进行一下练习。
再补一下阿里ctf2014年的第二题,因为过于简单,就不另开篇写了,具体解决方案在最下面
题目:APK在执行过程中使用了一个文件作为输入,请问该文件的名称是什么?(不需要路径)
apk:EvilAPK-1.apk 资源网上都有,这里就不给出下载地址了,另本文参考了一个大牛的博客,写的不是很详细,但是思路很好,这里的开始逆向的思路就是参照这个博客的,不过具体的工具和方法不同。当然通过这段时间的逆向学习,感觉逆向的工具与方法是各种各样的,大概掌握一两个就可以了,但是最重要的则是逆向的思路和代码调试的能力,这个就需要不断的练习和经验的积累了。本文用到的工具有jeb、apktool、signapk,废话不多说,开始正文吧!
基本概述与整体思路
第一步,还是先打开模拟器,apk安装跑起来,app效果如下。
刚开始看到这个的时候比较懵逼,没有任何操作的地方,而且这个app显示的是一个so隐藏测试程序,然后就不知道我们要做什么。后来看题目要求是找到输入文件的地址,那么我们就不用管这个app说的隐藏算法啥的,只需要找到输入文件的地址就可以了。
之后打开jeb,把apk拖进去,看一下apk的结构,还是有so文件的,那么先开始分析java层的代码和基本的逻辑结构。jeb反编译之后,这个apk很清楚,没有混淆,直接就能看到MainActivity,找到onCreate程序入口进行分析。
发现调用了readAssetFile方法,调取该方法代码,具体如下:
发现调用了JniEncode,这个类一看名字就知道是调用so文件的,果然,查看代码里面有两个native的函数库,并且两个函数都有一个传参进入。
那么我们还需要打开ida,分析so文件吗?这次我们并不需要这么做。我们在做题之前要明确我们逆向的目的,这个题目是要找出输入文件的名字,并不是要我们分析里面的算法等等。看一下这个readAssetFile方法,我们就会发现在调用这两个native函数的时候都要传一个参数,这个参数String V0 就是我们要找的文件地址,因此我们只需要找到这个V0的赋值就可以了。下面我们要注入代码,重新编译打包签名这个程序,让程序自己吐出我们需要的参数值。
Smali分析与反编译
在jeb中我们找到了需要获取的参数,但是jeb并不能直接进行更改,因此我们需要讲apk反编译成smali代码,再在smali中找到相应的地方进行修改。
那么先开始反编译吧,用apktool可以轻松实现反编译,然后在生成的文件夹中,找到smali->com->sotest->alibaba文件夹,打开我们要修改的MainActivity.smali文件(用任意编辑器即可打开),当然也可以快捷键直接找到MainActivity.smali文件。
apktool d EvilAPK-1.apk
在smali文件中找到readAssetFile方法,直接ctrl+f键快捷搜索,然后对比jeb反编译出的伪java代码,找到图中红色标记处,即调用JniEncode.getStringResult方法处。
对应的smali代码也很好找,刚好是这个line38行处,可以看到这个JniEncode的类名
代码注入及打包调试
找到了代码之后就要注入代码,这里我们要查看v0寄存器的值,因此我们可以将v0
寄存器的值打印出来,在line38处加入打印代码
const-string v3, "SN"
invoke-static {v3,v0}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I
加入后的效果如图所示
保存修改后的smali文件,然后将整个文件夹重新编译
apktool b EvilAPK-1
这个时候新生成dist文件夹,在这里面有我们新编译好的apk。然后将新编译好的apk重新签名
./signapk.sh EvilAPK-1.apk EvilAPK-1-1.apk
为了和原版区别,这里新签名后的apk名字和原先有一点区别。然后将新签名的apk安装在虚拟机中
adb install EvilAPK-1-1.apk
小tip:安装新的apk之前要把旧的apk删除掉
然后在命令行执行logcat语句,输出log信息,然后在虚拟机中点击app,当程序运行到我们注入代码的地方的时候,就会自动将v0寄存器(也就是String v0)的值打印出来了
adb logcat -s SN:v
至此,这个文件的信息就找出来了
其他方法
当然,这道题目很简单,也可以用其他方法进行查找
比如动态调试直接找到这个堆栈的内容等等
这里只是介绍了一种方法,重要的还是要清楚解题的思路,掌握一些基本的操作方法:-)
第二题
这里再补充一下alictf2014的第二题,因为过于简单,就不单独开一篇了,就直接在这里下面写上了
题目:请分析static_analysis.apk安装包。 分析出在静态代码中有多少个地方调用了sendSMS方法(不包括该方法本身且flag为数字)
解题方法:apk拖进jeb中,然后ctrl+f搜索sendSMS,找到19处,其中有一处是它自己,所以这个题的flag就是18
超级简单,有个注意点:当时在模拟器安装apk的时候报错
原因是模拟器本身有这个API demo的app,和我们这个apk重复了,因此删除以前的,即可重新安装成功