下载附件,用jadx-gui打开apk
直奔入口 MainActivity.java,看代码逻辑
String inputString = MainActivity.this.text.getText().toString();
PackageInfo pinfo = MainActivity.this.getPackageManager().getPackageInfo(BuildConfig.APPLICATION_ID, 16384);
String versionCode = pinfo.versionName;
int versionName = pinfo.versionCode;
for (int i = 0; i < inputString.length() && i < versionCode.length(); i++) {
if (inputString.charAt(i) != (versionCode.charAt(i) ^ versionName)) {
Toast.makeText(MainActivity.this, "再接再厉,加油~", 1).show();
return;
}
}
if (inputString.length() == versionCode.length()) {
Toast.makeText(MainActivity.this, "恭喜开启闯关之门!", 1).show();
return;
}
这里的inputString就是我们要输入的flag,下面是对flag的校验
这里用到了versionName 和 versionCode,那么这两到底是啥呢
我们转到BuildConfig.java看看
但是根据他奇怪的变量命名,,所以
String versionCode="X<cP[?PHNB<P?aj";
int versionName=15;
接下来是一个for循环对我们输入的flag字符串的每一位做遍历
if( inputString.charAt(i) != (versionCode.charAt(i) ^ versionName) ) return;
如果flag每一位 与 versionCode每一位亦或15不一致,则退出。
所以,答案就很明显了,flag= = versionCode每一位 ^ 15
编写python脚本
versionCode: str = "X<cP[?PHNB<P?aj"
versionName: int = 15
res = ''
for c in versionCode:
res += chr(ord(c) ^ versionName)
print(res)
"""
W3l_T0_GAM3_0ne
"""