▼更多精彩推荐,请关注我们
通过一道CTF题,来初步掌握手脱一代壳-内存Dump法
快来跟布布解锁新姿势吧。
内存Dump法
题目来自: 2014 alictf APK第三题
首先拿到APK,查壳。
发现加壳了,想到是多年前的题,用的肯定是多年前的壳,故也因为是一道CTF的题,不会在开始初步为难解题者,故判定是使用了我们现在所说的一代壳。(所谓的几代,就是加固安全员与脱壳者之间的对抗,日益升级后的结果)
我们尝试使用Dump法,也可写hook脱壳,不过这是题外话了。下面我们开始操作吧。
使用的工具:
1:IDA pro 7.0
2: root真机(4.4)
3:APKtool BOX
4:DDMS
首先,我们需要得到libdvm.so这个文件。他在手机的 /system/lib/ 中。我们为什么要使用这个so文件呢?因为一个函数的绝对地址=函数在so文件中的相对地址+映射到内存的基地址,而底层加载很多DEX的函数都在这个文件里面。所以我们要得到这个so文件加载它。从而可以找到函数下断点进行SO层的调试。
接下来我们讲讲怎么IDA附加调试(有基础的可以略过)
我们需要先开启IDA的调试功能。我们需要将IDA目录下的
这个文件夹里面的一个名为 android-server的文件使用 adb指令 push导入到 手机中指令如下,
adb push (android-server文件的路径)/data/local/tmp/
笔者认为,可以对其改名,笔者已将其改名为as。
这样方便我们以后在开启的时候方便快捷。导入之后。使用如下代码添加权限,注意,要进入文件所在目录进行对文件权限提升。可用以下代码在控制台输入
adb shell
su
cd /data/local/tmp
chmod 777 android-server
(笔者已经运行了,故提示已经运行)
完成后,继续输入 ./android-server 来启动文件,启动完成之后。
(笔者已经运行了,故提示已经运行)
另外打开一个控制台,输入以下代码进行进行端口转发
adb forward tcp:23946 tcp:23946 (注意,空格,冒号不能缺)
到此,IDA可以对手机进行附加调试了。
打开IDA把上面得到的SO文件拖入其中打开。(使用32位的IDA加载)
在菜单栏中选择:Debuggable -->select Debuggable
选择后出现如上图,选择第二个,然后点击OK。
然后我们
接下来,我们再次打开IDA在菜单栏中:Debuggable-->debuggable options 打开,勾上如图所示
再次点击OK。
我们再次点开:Debuggable --> Process options 输入如图 或者把localhost改为127.0.0.1。上方那些不用理会。保持默认即可。点击OK。继续下一步操作。
重新打开控制台。输入以下代码
adb shell am start -D -n com.ali.tg.testapp/.MainActivity
使进入可调式状态。
手机会如上图所示,不要理会。我们继续。
我们先找到dvmDexFileOpenPartial函数在so文件中的相对地址。在左边框框按ctrl+f 然后搜索函数名。双击,右边就会跳转。可见其相对地址为 0x00043CFC
再次点击Debuggable -->attach to process
来附加进程。我们找到我们的进程。如图
双击它即可附加成功。
进入一个调试页面。我们按 ctrl+s 搜索 libdvm
可见为0x414A900(后两者重新加载了,忽略)
我们相加,就是函数的绝对地址:0x00043CFC+0x414A9000=0x414ECCFC
我们在IDA中按 G键 输入上方的结果跳转即为该函数所在。
这时方法一,还有一种方法更加简单。直接在右方module处找到,libdvm.so。双击。出现如图,在按ctrl+f搜索
dvmDexFileOpenPartial
搜索后会出现
出现了一个函数,双击进入。发现进入后与我们上一种方法进入的地方一样。而且细致的你也发现了。
他给出的地址与我们上面算出来的绝对地址一样
在该函数入口按F2设下断点
然后按F9运行。
接下来我们需要打开一个控制台使用jdb命令启动连接attach调试器。命令如下
port处的端口号可以使用DDMS查询
回到ida,我们再次按F9运行(现在已经按两次了)然后等到程序运行到断点处。
选择R0寄存器。你就能看到如图所示了。这里有个特征字符串dex.035。而我们找到了dex在内存中的基地址,那我们怎么知道文件有都大呢?其实很简单,通过int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)这个函数我们可以知道,第一个参数是dex的基地址。第二个参数就是文件的大小了。而在寄存器中。R0-R4是储存函数的值。所以r0就是dex文件的基地址。r1就是文件的大小。
接下来我们打开脚本窗口编写脚本即可,脚本如下
你也可以算出具体的地址值带入进去,如下
然后点击OK,出现如下。请耐心等待,。别点击Cancel。已经在开始dump了。
结果
用jadx-gui打开。
成功。
接下来的分析就不是我们要讲的了。
结束。