Android逆向 -- 内存Dump法(初代壳)


 

 

 

▼更多精彩推荐,请关注我们

通过一道CTF题,来初步掌握手脱一代壳-内存Dump法

 

快来跟布布解锁新姿势吧。

 

内存Dump法

题目来自: 2014 alictf APK第三题

 

首先拿到APK,查壳。

image.png

发现加壳了,想到是多年前的题,用的肯定是多年前的壳,故也因为是一道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目录下的

image.png这个文件夹里面的一个名为 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 来启动文件,启动完成之后。image.png

(笔者已经运行了,故提示已经运行)

另外打开一个控制台,输入以下代码进行进行端口转发

adb forward tcp:23946 tcp:23946  (注意,空格,冒号不能缺)

image.png

到此,IDA可以对手机进行附加调试了。

 

 

打开IDA把上面得到的SO文件拖入其中打开。(使用32位的IDA加载)

在菜单栏中选择:Debuggable -->select Debuggable 

image.png

选择后出现如上图,选择第二个,然后点击OK。

然后我们

 

接下来,我们再次打开IDA在菜单栏中:Debuggable-->debuggable options 打开,勾上如图所示

image.png

再次点击OK。

我们再次点开:Debuggable --> Process options 输入如图image.png 或者把localhost改为127.0.0.1。上方那些不用理会。保持默认即可。点击OK。继续下一步操作。

重新打开控制台。输入以下代码

adb shell am start -D -n com.ali.tg.testapp/.MainActivity

使进入可调式状态。

image.png

image.png

手机会如上图所示,不要理会。我们继续。

我们先找到dvmDexFileOpenPartial函数在so文件中的相对地址。在左边框框按ctrl+f 然后搜索函数名。双击,右边就会跳转。可见其相对地址为 0x00043CFC

image.png

 

 

再次点击Debuggable -->attach to process

来附加进程。我们找到我们的进程。如图

image.png

双击它即可附加成功。

进入一个调试页面。我们按 ctrl+s 搜索 libdvm

image.png

 

可见为0x414A900(后两者重新加载了,忽略)

我们相加,就是函数的绝对地址:0x00043CFC+0x414A9000=0x414ECCFC

image.png

我们在IDA中按 G键 输入上方的结果跳转即为该函数所在。

image.png

image.png

 

 

 

这时方法一,还有一种方法更加简单。直接在右方module处找到,libdvm.so。双击。出现如图,在按ctrl+f搜索

dvmDexFileOpenPartial

image.png

 

 

搜索后会出现image.png

出现了一个函数,双击进入。发现进入后与我们上一种方法进入的地方一样。而且细致的你也发现了。

他给出的地址与我们上面算出来的绝对地址一样image.png

在该函数入口按F2设下断点

然后按F9运行。

接下来我们需要打开一个控制台使用jdb命令启动连接attach调试器。命令如下

image.png

port处的端口号可以使用DDMS查询

image.png

回到ida,我们再次按F9运行(现在已经按两次了)然后等到程序运行到断点处。

image.png

image.png选择R0寄存器。你就能看到如图所示了。这里有个特征字符串dex.035。而我们找到了dex在内存中的基地址,那我们怎么知道文件有都大呢?其实很简单,通过int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)这个函数我们可以知道,第一个参数是dex的基地址。第二个参数就是文件的大小了。而在寄存器中。R0-R4是储存函数的值。所以r0就是dex文件的基地址。r1就是文件的大小。

image.png

接下来我们打开脚本窗口编写脚本即可,脚本如下

image.png

你也可以算出具体的地址值带入进去,如下

image.png

然后点击OK,出现如下。请耐心等待,。别点击Cancel。已经在开始dump了。

 

image.png

结果image.png

用jadx-gui打开。image.png

成功。

接下来的分析就不是我们要讲的了。

结束。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM