找回密码
 立即注册
注册 登录
×
热搜: 活动 交友 discuz
查看: 136|回复: 3

如何只用GDA来“脱壳-反编译-解密”一道由360加固的CTF题

[复制链接]

2

主题

5

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2022-9-26 16:45:20 | 显示全部楼层 |阅读模式
本题建议使用最新版本,更加稳定和强大: 最新免费版下载.
如果使用中出现问题,参考这篇文章
CTF题目下载:vulcrack.apk

一、CTF题目

该题目为2020年网鼎杯的一道夺旗赛题目。




这道题主要麻烦在于加了360的保护壳,但题本身并不难,只要把壳脱掉并修复一下DEX头,最后用GDA反编译器分析和解题就能很快解题了,也不需要麻烦的做调试。
首先将apk文件拖到GDA中可以看出这是加了360壳的。



接下来我全程只通过GDA来实现该APK的脱壳,反编译分析与Flag的解密,以最快速度得到Flag。

二、开始解题

1、脱壳

首先点击Dump按钮,弹出Dump对话框,然后点击Install APK安装该apk到手机上(手机需要root),接下来启动安装好的app运行。回到GDA上右键刷新Dumpper左侧的包列表。之后就能看到该app的包信息,进程ID为5165,双击该进程(包名),可以看到该进程空间的分布。




接来下点击REF单选框将显示与app进程名称最相关的模块(如下图所示),有经验的一眼就能看出来.oat文件实际上就包含了原APP的DEX(如果不确定可以都dump下来反编译一下就知道了),不过有时候原始DEX会存在与堆中,这种情况下的脱壳使用GDA一样可以搞定,此处不介绍,有时间在讨论。






这里可以看到有好几个模块,我们需要按模块来DUMP,比如要DUMP classes.oat模块,首先点击第一个模块的第一行,然后拖动到该模块的最后一行,右键点击dump. 稍等一会儿,可以弹出dump成功的对话框.




点击OK,可以直接查看dump下来的文件,如图。






该文件为OAT文件,而脱壳后的DEX文件(头部的magic被抹去,GDA解析oat时会自动修复)就在该文件中。




2、反编译

这里修改文件后缀名为.oat然后拖到GDA主界面,我们可以看到脱壳后的代码(如果要转化为DEX可以使用菜单Tool>Oat2Dex进行转换),如图:



然后,大致看了看,发现可疑的Flag类






该类Flag很有可能就是答案所在,这里有两个函数(calcFlagFirstStep()和calcFlagSecondStep())似乎直接就是用来计算flag,看到代码已经很明显了,其中的Flag.keyFirst和Flag.keySecond就是Flag的两段密文。这两段密文通过base64解码后传给Flag.comm方法。双击进入comm方法:





这里不喜欢看try-catch,可以右键关闭try-catch,如图:





该功能通过GDA灵活的结构化算法实现,尤其在存在大量嵌套下的try-catch结构时,我们一般不太关心异常处理,那么关闭Try-catch将会大大简化程序流程的复杂性。最后得到重反编译后的代码:





到此算法一目了然,因此该题的flag只需要base64解码,然后使用该算法进行解密并重组起来即可。

3、解密Flag
在这里,我直接使用GDA自带的解密功能来实现,然后使用GDA  java脚本功能来解密。
首先打开GDA 加密解密工具,选择base64对两段字符串进行快速解密。






得到两段字符串:

fmcj.97;A7G462H;2F/7<I9496EH1(flag1:Zm1jan85NztBN0c0NjJIOzJGLzc8STk0OTZFSDE=)
A:HI9E4I1E6<}(flag2:QTpISTlFNEkxRTY8fQ==)

然后将comm()方法直接拷贝到脚本文件中(从此处下载GDA的java脚本案例,建议直接在目录example下创建java文件,注意java的类名和文件必须保持一致),然后根据如下调用方式调用comm()方法即可。


package example;
import com.gda.api.*;
//gjden
//decode ctf str

class DecodeCtfString {
        //copy from Request.ALLATORIxDEMO decompiled by GDA
        public static String comm(String str,int num){       
       String res = "";
       byte[] cmdbyte = str.getBytes();
       byte i = 0;
       while (i < cmdbyte.length) {       
          cmdbyte = (byte)(cmdbyte-(i%num));
          i = (byte)(i+1);
       }       
       try{       
          res = new String(cmdbyte, "UTF-8");
          return res;
       }catch(java.io.UnsupportedEncodingException e2){       
          e2.printStackTrace();
          return res;
       }       
    }

        public int GDA_MAIN(GDAInterface gda)
        {
                String str1="fmcj.97;A7G462H;2F/7<I9496EH1";
                String str2="A:HI9E4I1E6<}";
                String res=comm(str1,8)+comm(str2,4);
                gda.log(res);
                return 0;
        }
}


最后在GDA菜单File>Run Java/Class启动加载Java文件,直接就吐出来flag了如图:



回复

使用道具 举报

1

主题

2

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2022-9-26 16:46:03 | 显示全部楼层
如何导出源码,修改图标,再重新打包可以吗?
回复

使用道具 举报

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2022-9-26 16:46:49 | 显示全部楼层
这种事情不需要反编译
回复

使用道具 举报

0

主题

3

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 19 小时前 | 显示全部楼层
LZ是天才,坚定完毕
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋| 黑客通

GMT+8, 2025-4-5 20:52 , Processed in 0.088310 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2020, LianLian.

快速回复 返回顶部 返回列表