2014-阿里移动安全挑战赛第一题,考察分析算法、读取logcat的能力;

样本:https://github.com/Go0s/APKSample/blob/master/2014-阿里移动安全挑战赛/AliCrackme_1.apk

安装应用

安装应用到真机,观察应用交互逻辑;

1217511862.jpg

有个输入框及登陆按钮,输入错误弹窗提示;

反编译

使用jadx反编译看伪代码;

4159601903

获取输入值存入password变量,同时调用两个函数的返回值存入table变量及pw变量:

String table = MainActivity.this.getTableFromPic();
String pw = MainActivity.this.getPwdFromPic();

其中自带Log代码,省去插桩了:

Log.i("lil", "table:" + table);
Log.i("lil", "pw:" + pw);

通过bytesToAliSmsCode函数进行运算,打印enPassword变量值:

enPassword = MainActivity.bytesToAliSmsCode(table, password.getBytes("utf-8"));
Log.i("lil", "enPassword:" + enPassword);

bytesToAliSmsCode函数逻辑很简单:

private static String bytesToAliSmsCode(String table, byte[] data) {
	StringBuilder sb = new StringBuilder();
	for (byte b : data) {
		sb.append(table.charAt(b & MotionEventCompat.ACTION_MASK));
	}
	return sb.toString();
}

打印日志

目前无法发现flag是弹窗出来还是通过其他途径展示,但既然官方提供Log,先尝试一下打印Log;

2144155314

可以发现,我输入1,enPassword值为“么”,而table和pw变量值一定,这时测试字符和数字;

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

至此没有利用pw变量,且其也有固定值,猜测其就是flag值;

由于”enPassword:毛片止气长化仁冈牛手比升瓦少日中贝内水仇仆切什互午见么广亡门义之尸弓己丸“的汉字对应字符【a-z0-9】,将”pw:义弓么丸广之“的汉字映射到enPassword,发现是”581026“,将其输入到输入框,弹框”恭喜!!破解成功!!!“;

解密

当然也可以直接解密pw值,解密函数aliCodeToBytes()作者竟然也写出来了,直接拿来用;

import java.lang.*;

public class Alicrack {

    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[] cmdBuffer = new byte[strCmd.length()];
        for (int i = 0; i < strCmd.length(); i++) {
            cmdBuffer[i] = (byte) codeTable.indexOf(strCmd.charAt(i));
        }
        return cmdBuffer;
    }
}