总体来说逆向的题目质量挺高~感觉学到了不少东西=-=
就是第三题放题时间有点晚233没有公网的情况下做题难度确实比较大
欢迎各位师傅指出疏漏错误和交流~
Re1
JAVA层
用JEB查看反编译代码,JAVA层做了如下操作
有点绕,不知道是出题人故意还是无意地,这个处理写的很蛋疼
除了上述列出的字符以外都是保留不变的
output的范围是彼此分开的,因此可以写出该处理的反函数
def decode(x):
if(x>48 and x<57):
return x+1
elif(x>97 and x<97+26):
return 123-x+97
return
elif(x>=65 and x<=65+26):
return 91-x+65
else:
return x
接下来将处理过后的输入和this.b()
送入native函数this.b(String, String)
中
this.b()
通过getPackageInfo.signatures
来获得应用签名,是一个固定值
最简单的方法当然就是直接JEB动态调试挂上去,但是运行起来发现根本没有输入框,仅有一个Check按钮
查看代码感觉没有什么隐藏的,于是找来res/layout/activity_main.xml
发现
把它删掉再重打包就可以看到输入框了,当然这样重打包会导致签名不一样233
但是不重打包的话,又会由于输入内容为空而不会进入到b方法的调用中,所以动态调试就陷入一个死循环的尴尬了233
除了动态调试以外,还有两个方法在不进行重打包的情况下拿到签名:
- 编写应用取出“第三方”APK的签名
- Hook
Hook对我来说比较熟悉,所以比赛的时候用的是Xposed:
XposedHelpers.findAndHookMethod(
"com.example.crackme.MainActivity",
lpparam.classLoader,
"onClick",
View.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
String md5 = (String)XposedHelpers.callMethod(param.thisObject, "b");
Log.e("test", "get md5: " + md5);