前言
Android逆向,介绍三个工具:
1.JEB,2.Androidkiller,3.安卓模拟器。
之前逆向所使用的IDA工具,基本可以解决大多数跨平台类型的逆向题目。但是,对于Android的逆向题目,我们有更合适的工具。
注:JEB 和 Androidkiller 由java环境编写,使用者请提前安装好jre1.9以下的环境。
2018/8/7 9:16
JEB:
下载好之后,进入jeb的bin目录:
里面由jeb2-sp-win32-v2.zip(32位java环境)和jeb2-sp-win64-v2.zip(64位Java环境)
使用时,根据java环境的位数解压不同的zip包,覆盖当前目录即可。
JEB能够翻译非常准确的语句,不支持修改程序、重新编译、签名
JEB界面如下:
我们打开本次的Android逆向题目:
双击Bytecode(dex)(因为我们要反汇编做逆向)
然后出现各种包、类:
这是安卓的语言(好像是smil)
我们跳入MainActivity类中,对正文处右击可decompile为java语言:
我们要分析的,就是正文内容。
步骤:因为是在做题,所以我们可以先跳过大量的类、方法的定义,直接找调用类和方法的程序,来寻找校验输入的程序。
我们在main中找到如下代码:
调用check2函数,与我们的输入文本作为参数进行校验。
双击check2,可跳转到定义函数check2的地方。
如下图:
这两个图为check2函数相关代码。
首先我们知道,check2函数的参数,就是我们的输入,在此被命名为arg15。
此处执行校验的代码段:
while(v4
if((v7[v4] & 255)!= ((arg15.charAt(v4) ^ v5.charAt(v4 % v5.length())) & 255)) {
throw newRuntimeException();
}
++v4;
}
v4之前被赋值为0,在这里作为了步长变量(v4的意义)。
回溯代码可知,arg15要求长度:16(我们的输入为16位)
“v7[v4] & 255”:
此处进行“位与”运算,v7数组的值,和8个1(255就是1111 1111)位与,实际上就是v7自己的值。
“arg15.charAt(v4) ^ v5.charAt(v4 % v5.length()”:
v5:我们可以找到,v5就是getKey()的返回值字符串:“goodluck”,8个字节。
v4作为步长对8取余.v4从0到15共16次,上述代码将“goodluck”字符串单个字符循环取两遍。
恭喜你,看到这里,已经对该题目有所了解了。
一句话:将自己的16位输入,和 “goodluck” 做异或 ,最终要等于 v7 数组的值。
我们根据v7数组和“goodluck”,写一个python脚本进行解密。
注意:有的小伙伴不知道异或怎么算。我给出公式:a ^ b = c => b = a ^ c
很类似乘法交换律。
脚本如下:
运行:
这道逆向题的passcode就出来了。
接下来,只需要在题目中输入passcode获取flag即可。此处就不作演示了。
领取专属 10元无门槛券
私享最新 技术干货