【CTF reverse 安卓逆向】带你走通安卓逆向流程(萌新向)

以buu-findit这道简单的安卓逆向题为例。我们的目标是修改apk并重新打包+签名,让它能在安卓模拟器上正常运行,且无论输入什么字符串都可以输出flag。

作者:hans774882968以及hans774882968

工具

  1. apktool:下载指导。只是一个jar包而已。
  2. 安卓模拟器Genymotion3.2.1,有免费版的,但要在他的网站注册账号。

配置Genymotion还有点麻烦……网上有的教程都是很老的了,我可能以后会写个详细的。就记一下我遇到的问题:

  1. 拖拽的时候鼠标显示禁止,即无法拖拽:设置兼容性,Windows8,并且不要以管理员权限运行。二者似乎是缺一不可的。
  2. Genymotion-ARM-Translation安装失败:不要选新的,Android10的会失败(准确来说,是Genymotion-ARM-Translation版本和你的模拟器支持的安卓版本要匹配)。
  3. 不过后来发现www.jianshu.com/p/1db4cb031… 这个链接提供的百度网盘提供了支持Android9的Genymotion-ARM-Translation。
  4. 拖拽安装app能正常安装并打开即可。

寻找关键代码

JEB查看不再赘述。我们找到这段smali

.method public onClick(View)V
          .registers 14
00000000  const/16            v11, 17
00000004  const/16            v10, 0x007A
00000008  const/16            v9, 90
0000000C  const/16            v8, 65
00000010  const/16            v7, 97
00000014  new-array           v3, v11, [C
00000018  const/16            v5, 38
0000001C  new-array           v4, v5, [C
00000020  const/4             v0, 0
:22
00000022  if-lt               v0, v11, :70
:26
00000026  const/4             v1, 0
00000028  invoke-static       String->valueOf([C)String, v3
0000002E  move-result-object  v1
00000030  iget-object         v5, p0, MainActivity$1->val$edit:EditText
00000034  invoke-virtual      EditText->getText()Editable, v5
0000003A  move-result-object  v5
0000003C  invoke-interface    Editable->toString()String, v5
00000042  move-result-object  v5
00000044  invoke-virtual      String->equals(Object)Z, v1, v5
0000004A  move-result         v5
0000004C  if-eqz              v5, :190
复制代码

对照反编译后的代码,我们可以知道,:190标签后面就是失败的语句。因此我们只需要移除这条if-eqz指令。

修改smali

下载apktool(只是一个jar包而已)。并执行java -jar apktool.jar d 1.apk,即可生成同名的反编译后的文件夹。我们找到MainActivity$1.smali,把以上语句删除即可。

不过我怎么可能满足于此?我们不妨让它输出些更有意思的内容。

    # 首先要把寄存器个数改多一点
    .locals 15
    
    # 然后在下面添加一些代码
    .line 69
    iget-object v5, p0, Lcom/example/findit/MainActivity$1;->val$text:Landroid/widget/TextView;
    # 自己的代码start
    new-instance v12, Ljava/lang/StringBuilder;
    # 调用构造函数
    invoke-direct {v12}, Ljava/lang/StringBuilder;-><init>()V

    const-string v13, "信息:I am an great acmer!"

    invoke-virtual {v12, v13}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-virtual {v12, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    invoke-virtual {v12, v13}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v12}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v2
    # 自己的代码end
    invoke-virtual {v5, v2}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

    .line 74
    .end local v2    # "n":Ljava/lang/String;
    :goto_2
    return-void
复制代码

这个smali语法我现学的,invoke-virtual用来调用方法,move-result-object把方法的返回值赋给寄存器。

期间我扔模拟器,发现它老崩溃,debug了许久才发现我的v12忘记调用构造函数了。

重新打包+签名

用apktool打包,用Java自带工具签名apk。

打包命令:java -jar apktool.jar b 1 -o 1-out.apk

签名apk:

  1. 到Java安装目录(即bin文件夹,有java.exe的文件夹)下,运行命令.\keytool -genkeypair -alias demo.keystore -keyalg RSA -validity 500000 -keystore demo.keystore。然后他会问你几个问题,就是姓名、地址之类的。其他的都随便填,只有密码要注意。只有第一次需要生成这个,以后可以复用的。
  2. jarsigner需要用到上面的keystore文件。命令:.\jarsigner -keystore D:\xxx\demo.keystore -signedjar D:\xxx\1-signed.apk D:\xxx\1-out.apk demo.keystore。这里有4个参数,分别为keystore文件、输出文件路径、输入文件路径和keystore别名。然后它会让你输keystore的密码的。

把所得apk直接拖进模拟器即可。

效果

如图

result.jpg

参考链接

  1. 安卓逆向流程:www.52pojie.cn/thread-8224…
  2. smali怎么拼接字符串:blog.csdn.net/sumsear/art…
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享