这道题是个 elf 文件,在 Linux 环境中打开之后发现什么提示都没有,随便输入一串字符也没提示就直接退出了,于是就还是用 ida pro 打开,发现没有主函数的窗口,那就检索字符串吧,看到这么一大堆字符串

然后交叉引用一下进入到该字符串所在的函数,这应该就是关键函数了,发现这里有十个一样的函数

就发现这是 base64,而且进行了十次,进行十次之后的结果就是刚才那一大堆字符串,然后把它解码十次之后,就… 就得到了一个网站 https://bbs.pediy.com/thread-254172.htm,然后进去这个网站之后,根本就没有 flag

说明我们思路不对,所以我就返回去看主函数,看到这一部分

这里将三个字符串拼到一起,然后还在 v [12] 和 v [13] 的末端加了一个 127,然后再进行一次异或运算,写了个脚本得到了 Info:The first four chars are `flag`,这应该是一个提示,然后在这里呆了半天也不知道下一步该怎么做,看了大佬的题解提示,在进行完上面的异或和 base 循环之后,下面又调用了 sub_400D35 这个函数

我们看看这个函数

关键部分就是一个 if 条件语句和一个 for 循环了,if 的括号中的条件,是 v4 和一个已知数组的异或

1
[0x40, 0x35, 0x20, 0x56, 0x5D, 0x18, 0x22, 0x45, 0x17, 0x2F, 0x24, 0x6E, 0x62, 0x3C, 0x27, 0x54, 0x48, 0x6C, 0x24, 0x6E, 0x72, 0x3C, 0x32, 0x45, 0x5B]

也容易看出前四位的异或结果应该就是 flag 了,然后在下面的 for 循环中再和 v4 进行异或,要知道 v4 我们就再进行一次异或就可以得到,然后就可以进行 for 循环中的异或了,异或之后的结果应该就是 flag 了,毕竟前四个结果就是 flag 嘛,脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
a = [73, 111, 100, 108, 62, 81, 110, 98, 40, 111, 99, 121, 127, 121, 46, 105, 127, 100, 96, 51,
119, 125, 119, 101, 107, 57, 123, 105, 121, 61, 126, 121, 76, 64, 69, 67]

for i in range(len(a)):
a[i] = chr(a[i] ^ i)
print(a[i], end='')

print()

b = [0x40, 0x35, 0x20, 0x56, 0x5D, 0x18, 0x22, 0x45, 0x17, 0x2F, 0x24, 0x6E, 0x62,
0x3C, 0x27, 0x54, 0x48, 0x6C, 0x24, 0x6E, 0x72, 0x3C, 0x32, 0x45, 0x5B]
c = 'flag'
v1 = ''
flag = ''
for i in range(len(c)):
v1 += chr(b[i] ^ ord(c[i]))
print(v1)
for i in range(len(b)):
flag += chr(b[i] ^ ord(v1[i % 4]))
print(flag)

得到 flag {Act1ve_Defen5e_Test}

题目来源:BUUCTF 在线评测 (buuoj.cn)——[2019 红帽杯] easyRE