• 了解动态调试smali


    通过两道CTF题,来了解和初步掌握smali动态调试的用法

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

    1: Ph0en1x-100

    题目来自: 攻防世界  mobile 新手练习区

    使用APKtool BOX 查壳。发现未加固。

    image.png

    使用Android Killer 打开apk。找到入口。如下图。

    image.png

    然后使用jeb或者jdx-gui打开APK文件查看反汇编过了JAVA代码。(JEB是一款常用于动态调试smali代码的一款软件)我们使用先用jdx-gui打开。然后进到上图所获取的程序入口。分析代码。下图是全文。image.png

    通过代码分析,可知,两个主要的方法要在名为:phcm.so文件中加载来获取。

    image.png

    然后继续分析下去,就是简单的if判断了。也是我们做出这道题的关键了。

    image.png

    if的条件就是如果getSecret(getFlag()) 返回的值等于 getSecret(encrypt(this.etFlag.getText().toString())) 就为真。前者getFlag()自己生成一段字符串。后者是读取我们输入的文本转换成字符串然后作为参数传入encrypt()这个方法里面,然后返回字符串又作为参数被getSecret()调用。到此,逻辑就分析完毕了。

    由两种解法,一种是使用IDA静态分析SO里面getflag()的逻辑,查看他最后返回的值。而另一种方法就是我们接下来要讲的。动态分析smali代码,直接获取返回的值。

    我们先要使APK可调试,我们需要在AndroidManifest.xml文件里添加可以使我们的调式代码的指令。然后保存,反编译回去。笔者使用Android Killer直接 修改 、反编译和安装。

    image.png

    image.png

    然后打开JEB。加载APK。找到该地方的smali代码。连接手机(笔者为真机,也可在虚拟机上进行调试,都可)打开控制台使用adb指令查看设备是否连接。

    image.png

    如上图,手机已经正常连接。

    image.png

    附加调试image.png

    设断点

    image.png

    在手机上随便输入一点东西按GO。

    image.png

    程序开始运行,然后运行到我们设置的断点停下。

    image.png

    讲VM变量区的v1变量改为srting类型

    image.png

    然后按F6单步步入。留意右边变换的值。

    image.png

    运行到此时,v1变量的值出来,也为getflag()返回的值

    image.png

    此为我们需要的密文。此密文等价于encrypt(this.etFlag.getText().toString())返回的值,即此密文,是我们输入的字符串,经过encrypt()加密后的结果,我们使用IDA加载so文件,查看这个函数逻辑伪代码。

    image.png

    我们输入的每个字符都经过  --  操作,即ASCII 码减去 1得到的密文。所以我们对密文的每一个字符经过 ++ 操作,即ASCII码加上1,即为 我们的原文,也是我们所要的flag。

    脚本如下

    image.png

    image.png

    2: FindPass

    题目来自: Jarvis OJ REVERSE 

    上文步骤已经很详细了,省略一点,我们直入正题。

    使用APKtool BOX 查壳。发现未加固。

    使用Android killer 找到程序入口,因为我们已经知道了要smali调试代码,(笑)我们可以先在AndroidManifest.xml文件里添加可以使我们的调式代码的指令。保存、反编译、安装。

    然后用jax-gui打开,主要逻辑如图

    image.png

    同为if判断。分析后发现也为比较两值得大小。image.png

    前者是我们输入的字符串,后者是程序读取一张图片返回字节流然后通过一系列运算存到ekey中。而后者,跟上一道题一样返回的结果也是程序帮我做完了。可以直接通过smali动态调试获取这个返回的结果。

    我们直接操作。

    JEB附加调试,设置断点

    image.png

    手机随便输入,使程序运行。

    image.png

    jeb上按F6单步步入

    image.png

    查看变量值

    image.png

    笔者改了v4,v5 ,v9的变量类型,最后在v9发现我们想要的值。此即为我们最终的flag

    小结

    如果你发现,一些与我们解题有关的方法返回值,是程序自己帮你运行算出的,也不用你输入参数,即可动态调试smali来获取这个返回值。

  • 相关阅读:
    systemctl命令
    linux下常用命令查看端口占用
    【PostgreSQL】存取jsonb
    tomcat内存溢出之PermGen space
    Spring事务传播机制
    java框架篇---spring aop两种配置方式
    Hibernate一对多实例
    Github 的系统内部都在用什么开源软件?
    这是一个关于软件开发的博客。
    JavaScript中数组的集合和映射
  • 原文地址:https://www.cnblogs.com/pupububu/p/13761959.html
Copyright © 2020-2023  润新知