CTF安卓逆向练习第三弹

CTF安卓逆向练习第三弹–静态分析及monitor使用

写在前面的话:这次练习的是阿里安卓CTF2015年比赛的第一题,一个比较简单的题,主要练习一下monitor的掌握以及静态的java逻辑分析等能力

APK:AliCrackme_1.apk
题目:找到密码

基本概述与整体思路

刚拿到apk,还是一般的思路,先在模拟器上跑起来,看看这道题让我们干什么。
这里写图片描述
app界面很简单,也很清楚,在输入框里输入密码,点击登录按钮实现登录,我们的目的就是破解到这个密码。下面看一下apk的结构,很好,没有so文件等,拖进jeb中,很清楚的就编译出来,可以看到各个类方法的名字。整体来说这个apk还是比较简单的,没有用到so,没有加壳,没有混淆,纯java的一个程序。下面我们就用jeb在java层面上进行分析即可。
这里写图片描述

关键代码定位

因为解题需要,我们要尽量快速定位到关键代码处。可以先在strings.xml文件中看看有没有能给我们帮助的信息,在这里能看到一个“恭喜!!!破解成功!!!”的字符串,找到对应的string name=dialog_good_tips
这里写图片描述
然后我们在public.xml文件中找到这个字符串的id,可以用ctrl+F快捷键找寻,发现这个id=0x7f0a0012,对应的十进制是2131361810
这里写图片描述
然后在伪java代码处找到这个2131361810,发现这是一个showDialog显示调用的一个方法
这里写图片描述
接下来找一下有谁调用了这个方法,找到这个地方之后,从下往上看,很明显能看到一个if判断语句,如果想走到下面的分支,那么就要满足上面的判断条件。再来看这个判断条件,前半部分很明显,都是判断不能为空之类的,后半段有一个很明显的判断,就是这个v4寄存器要和v2寄存器的内容相等,那么我们可以说这个v2寄存器就是我们要找的
这里写图片描述
接下来继续看v2,发现他是通过bytesToAliSmsCode方法得到的,而这个方法有两个输入值,一个是v5,一个是v3。继续向上看,很容易看到v3就是我们这个框里我们自己输入的值,而v5则是通过getTableFromPic这个方法得到的。
至此,再从上往下屡一下,我们知道了这个app总体的逻辑:通过getTableFromPic得到参数v5,通过getPwdFromPic得到参数v4的值,然后将我们输入的密码v3和之前得到的参数v5通过bytesToAliSmsCode做一定的变换,得到参数v2,最后将v4和v2做比较,相等则完成破解。

monitor的使用

在分析了一定的代码逻辑之后,我们就要确定这些传递的参数的值都是多少,观察伪java代码,发现这个apk在编写的时候已经吧我们需要的v5、v4、v2等参数用Log.i的方式记录在日志中了,而且其相应的“table”、“pw”、“enPassword”等名字也很有代表性,也进一步验证了我们之前分析的想法。
这里写图片描述
接下来我们就要观察这些日志的内容了,打开Android自带的monitor,在Android安装包中tools文件夹里就有
这里写图片描述
在接下来打开的monitor中,我们可以增加筛选条件,比如application的名字、tag等,只要方便就可以
这里写图片描述
然后我们在模拟器中将这个app打开,随便输入一串密码,然后点击登录按钮,然后观察monitor的值。很清楚的显示了参数的值,其中table就是v5的值,enPassword就是我们输入的值v3,pw就是用来比较的值v4,这个v4就是我们要找的flag,也就是最终的密码
这里写图片描述
在这里我们可以看到输出的值都是很怪异的汉字,其中pw的值是“义弓么丸广之”,这是将一串数字经过了一定的变换,最后才得到这一串密码,那么这个变换是什么样的?这就需要我们接着进行分析。

静态详细分析

接下来,根据上面的一些逻辑关系,我们再把几个关键的方法分析一下,包括getTableFromPic、getPwdFromPic、bytesToAliSmsCode几个方法。
首先是getTableFromPic,可以看出总体思想是通过一个图片,读取图片的字节,然后做相应的转换。同理,getPwdFromPic也是相同的思路,这里就不详细概述了。
这里写图片描述
接下来是bytesToAliSmsCode方法,其思路是把得到的字符串进行一系列位的变换。
这里写图片描述

快捷方法

在经过上面的一些分析之后,我们还是感觉有些头大,难道真的要将我们得到的密码照着算法进行这些复杂的转换吗?这里我们再次明确一下我们做这个逆向的目的,我们的目的只是得到密码,而不是对整个app的算法进行解析,因此有一个简便快捷的方法。经过分析我们知道这个密码是一串数字,每个数字经过一系列转换得到对应的汉字,那么我们完全可以把每个数字得到的转换后的汉字都显示出来,做出对应表,要知道每一位的数字只有0-9这10个结果。
我们打开模拟器中的app,在输入密码处依次输入0123456789,得到相对应的结果,然后pw对应的密码也可以马上得出:581026
这里写图片描述
最后将结果输入试一下,bingo!果然成功!
这里写图片描述

算法逆向

当然上面的快捷方法适合比赛的时候用,而且不具有普遍性。在我们练习的时候还是要尽量将算法进行解析,找到解决的策略,这里参考了一个别人的博客的内容,自己简单写了一点代码做练习了一下。
首先我们之前静态详细分析的时候已经分析了几个关键函数,其中bytesToAliSmsCode可以说是一种加密的算法,然后在这个代码的附近我们很快就找到了解密的算法,aliCodeToBytes,那么我们就可以用这个解密的算法写一个小demo,将密码得到。
这里写图片描述
这里贴上代码,其中table和pw中的字符串都是monitor中捕获的log内容

import java.lang.*;

public class Ali{
    static String table;
    static String pw;
    public static void main(String[] args){
        table=new String("一乙二十丁厂七卜人入八九几儿了力乃刀又三于干亏士工土才寸下大丈与万上小口巾山千乞川亿个勺久凡及夕丸么广亡门义之尸弓己已子卫也女飞刃习叉马乡丰王井开夫天无元专云扎艺木五支厅不太犬区历尤友匹车巨牙屯比互切瓦止少日中冈贝内水见午牛手毛气升长仁什片仆化仇币仍仅斤爪反介父从今凶分乏公仓月氏勿欠风丹匀乌凤勾文六方火为斗忆订计户认心尺引丑巴孔队办以允予劝双书幻玉刊示末未击打巧正扑扒功扔去甘世古节本术可丙左厉右石布龙平灭轧东卡北占业旧帅归且旦目叶甲申叮电号田由史只央兄叼叫另叨叹四生失禾丘付仗代仙们仪白仔他斥瓜乎丛令用甩印乐");
        pw=new String("义弓么丸广之");
        System.out.println(new String(aliCodeToBytes(table,pw)));
    }

    private static byte[] aliCodeToBytes(String codeTable,String strCmd){
        byte[] v1=new byte[strCmd.length()];
        int i;
        for(i=0;i<strCmd.length();++i){
            v1[i]=((byte)codeTable.indexOf(strCmd.charAt(i)));
        }
        return v1;
    }
}

运行之后得到密码值,和我们之前快捷方法得到的值是一样的。
这里写图片描述

最后的总结:这次的题目还是比较简单的,主要练习了静态分析能力,注重代码逻辑分析的思想,以及monitor的使用等:-)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值