入门级的Crackerme之安卓逆向分析

入门级的Crackerme之安卓逆向分析

0x1:前言

还有半年的时间就要毕业了,目标的职位是移动安全工程师,从今天起开始记录下自己日常的一些工作。今天的这个样本是在吾爱破解论坛(www.52pojie.cn)中看到的一个帖子,该帖子是分析文档。所以在看分析文档前,先自己尝试破解下。

 

0x2:任务要求

根据软件打开的界面,可以猜测,接下来的任务应该就是当我们点击”CHECK FLAG”按钮的时候,根据我们输入的值,返回一个正确的值即可。

 

0x3:分析过程

  1. 使用Jadx打开实验APK 。简单的浏览代码,定位到关键的位置。从下图中的“1”处,我们可以看到这边是验证成功的地方,也就是说,当 if的条件为true的时候,我们验证成功。我们的突破点或许就在这边。

那么它的一个逻辑是:

doEncrypt函数的加密结果 =

"XclSH6nZEPVd41FsAsqeChz6Uy+HFzV8Cl9jqMyg6mMrcgSoM0vJtA1BpApYahCY"的值,即可成功攻破这个题目。

 

2.当我们进入doEncrypt的时候,我们其实会发现,它读取了"kawai.jpg"文件。

public String doEncrypt(String source) {

        try {

            char[] iv = new char[16];

            BufferedReader reader = new BufferedReader(new InputStreamReader(ContextHolder.getContext().getAssets().open("kawai.jpg")));

            reader.skip(424);

            reader.read(iv);

            reader.close();

            return Base64.encodeToString(encrypt(source.getBytes(),this.key.getBytes(), charArrayToByteArray(iv)), 2);

        } catch (Exception e) {

            e.printStackTrace();

            return "";

        }

    }

这个时候,我个人认为,静态分析起来已经不太好了,因此我决定使用动态分析的方法,来看看它的这个iv到底是何方神圣。这边,我使用到的动态调试工具:JEB

分享Smali代码,下断点。

 

然后附加进程。点击OK的时候,发现无法附加。这里我们用androidKiller把APK的Androidmanifast文件添加个debugger属性即可。

android:debuggable="true"

 

此时我们就可以顺利的进行动态调试了。

此时我们发现,v3也就是暂未通过charArrayToByteArray处理的iv值是一些特殊字符,所以我们现在其实可以直接把断点下到charArrayToByteArray返回结果的下一条smali代码中去。

 

此时的v7的结果正是我们所需要的iv值。我们稍后可以编写代码来看看它是啥东西,现在先把东西记录下来。

iv =[13, 14, 13, 16, 14, 14, 16, 20, 14, 14, 14, 20, 20, 14, 14, 14]

 

然后我们分析encrypt函数的各个参数

参数1(arg6):加密内容  (其实是我们输入的值)

参数2(arg7):key  "3b0de20546e9331c7c87aaabf9d0d4afd8c8a761"

参数3(arg8):iv(上面已分析)

加密方式很显然是"AES/CFB/PKCS7Padding"

 

其次,就是encrypt函数中的transformKey这个方法了。我们发现它再次对"kawai.jpg"图片进行了操作。

 

2. 整理思路

  1. 分析了一圈,我们发现这个kawai图片应该是很重要的.但是我们为什么一定要去知道它呢?
  2. 我们把需要的结果拿到就好了呀! 再最开始的时候我们分析过,结果是和"XclSH6nZEPVd41FsAsqeChz6Uy+HFzV8Cl9jqMyg6mMrcgSoM0vJtA1BpApYahCY"这段结果进行比较的。 这个结果我们先对它AES解密得到明文不就好了嘛?

3.重新战斗。

 

通过之前的方法获得真实的key.

key = {46, 121, 19, 74, -104, 25, -51, -56, 73, -53, -104, -60, 73, -50, -52, -98, -54, -98, 104,-54, -100, 27, -100, 5, -101, 46, -103, -51, 10, -55, 62, -101};

那么我们只需要把拿到的iv和key对XclSH6nZEPVd41FsAsqeChz6Uy+HFzV8Cl9jqMyg6mMrcgSoM0vJtA1BpApYahCY进行解密即可。

 

0x4:Java代码编写

由于高级编程语言基础功底限制,所以java只被我拿来进行了一个字符转换

1.先是用了个bytesToHexString方法(参考网络)将key和iv转换成十六进制

public static String bytesToHexString(byte[] bArr) {
    StringBuffer sb = new StringBuffer(bArr.length);
    String sTmp;

    for (int i = 0; i < bArr.length; i++) {
        sTmp = Integer.toHexString(0xFF & bArr[i]);
        if (sTmp.length() < 2)
            sb.append(0);
        sb.append(sTmp.toUpperCase());
    }

    return sb.toString();
}

 

然后我再用了一些加密的测试工具把结果解密

 

如此这般,结果出来啦~~~

 

 

0x5:总结

这个CTF其实不难,但是没必要每行代码都去分析清楚,我认为我们在很多时候都应该直接分析,直击要害,这样才可以提高我们的工作效率。另外动态调试可以大大的提高我们的分析速度,同时我们要注意我们分析的apk是否允许调试,如果不允许调试,我们应该怎么去破解它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值