BUUCTF 简单注册器 1

题目是简单注册器

分析

直接运行下
BUUCTF 简单注册器 1_第1张图片
有个错误提示,使用jadx查找 (ctrl + shift + f)
在这里插入图片描述
BUUCTF 简单注册器 1_第2张图片
直接复制下代码

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("输入注册码错误");

解法

这题可以有两种解法

  1. 跟踪bbb变量,解出bbb,因为flag就是bbb
  2. 只要flag=1就可以拿到flag

相比来说,明显第二种情况更简单(从代码量看出来的)
而且作者的本意可能就是这个,因为题目就是注册机,注册机一般就是通过注册码的判断

xx.length() != 32 || 
xx.charAt(31) != 'a' ||
xx.charAt(1) != 'b' ||
(xx.charAt(0) + xx.charAt(2)) - 48 != 56

让以上条件全部为false即可
这个xx就是我们输入的值

一共四个条件,我们需要满足

  1. 长度等于32
  2. 最后一个字符为a
  3. 第二个字符为b
  4. 第一个字符 第三个字符 减 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
BUUCTF 简单注册器 1_第3张图片

flag复制不出来就不复制了
BUUCTF 简单注册器 1_第4张图片

你可能感兴趣的:(#,reverse,网络安全)