• 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

    成功。

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

    结束。

  • 相关阅读:
    uwsgi wsgi nginx centos7.2部署flask
    以守护进程的方式部署flask
    新装Centos7.2 配置防火墙
    django 编程小结
    install plugin elasticsearch-analysis-ik
    为什么配置环境总是出现个各种问题呢?
    configure HDFS(hadoop 分布式文件系统) high available
    ConstraintLayout UI性能分析
    Android处理滑动与点击事件的冲突
    android自定义渐变圆环进度条
  • 原文地址:https://www.cnblogs.com/pupububu/p/13766218.html
Copyright © 2020-2023  润新知