[XCTF] mobile app1

下载附件,用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
"""

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值