题目是简单注册器
分析
直接运行下
有个错误提示,使用jadx查找 (ctrl + shift + f)
直接复制下代码
int flag = 1;
String xx = editview.getText().toString();
if (xx.length() != 32 || xx.charAt(31) != 'a' || xx.charAt(1) != 'b' || (xx.charAt(0) + xx.charAt(2)) - 48 != 56) {
flag = 0;
}
if (flag == 1) {
char[] x = "dd2940c04462b4dd7c450528835cca15".toCharArray();
x[2] = (char) ((x[2] + x[3]) - 50);
x[4] = (char) ((x[2] + x[5]) - 48);
x[30] = (char) ((x[31] + x[9]) - 48);
x[14] = (char) ((x[27] + x[28]) - 97);
for (int i = 0; i < 16; i++) {
char a = x[31 - i];
x[31 - i] = x[i];
x[i] = a;
}
String bbb = String.valueOf(x);
textview.setText("flag{" + bbb + "}");
return;
}
textview.setText("输入注册码错误");
解法
这题可以有两种解法
- 跟踪bbb变量,解出bbb,因为flag就是bbb
- 只要
flag=1
就可以拿到flag
相比来说,明显第二种情况更简单(从代码量看出来的)
而且作者的本意可能就是这个,因为题目就是注册机,注册机一般就是通过注册码的判断
xx.length() != 32 ||
xx.charAt(31) != 'a' ||
xx.charAt(1) != 'b' ||
(xx.charAt(0) + xx.charAt(2)) - 48 != 56
让以上条件全部为false即可
这个xx就是我们输入的值
一共四个条件,我们需要满足
- 长度等于
32
- 最后一个字符为
a
- 第二个字符为
b
- 第一个字符
加
第三个字符 减48
等于56
python注册机
import random
import string
register_code = random.choices(string.ascii_letters + string.digits, k=32)
register_code[-1] = 'a'
register_code[1] = 'b'
register_code[0] = '0'
register_code[2] = '8'
print(''.join(register_code))
直接运行就可以得到注册码,然后输入注册码得到flag
flag复制不出来就不复制了