逆向攻防世界CTF系列3-game

打开看下:

image-20241012100633461

玩一个游戏
n 是灯的序列号,m 是灯的状态。如果第 N 盏灯的 m 为 1,则灯亮,否则灯灭。
起初所有的灯都是关闭的,现在您可以输入 n 来改变它的状态,但您要注意一点,如果您改变了第 N 盏灯的状态,第 (N-1) 盏灯和第 (N+1) 盏灯的状态也会随之改变。
当所有灯都亮起时,会出现flag,现在输入 n.n(1-8)

解法一:

一次输入12345678,得到flag(看的其他大佬,用广度优先,不理解为什么可以用广度…)

image-20241012103050631

解法二:

扔到exeinfo查,无壳,32位exe

image-20241012100101118

扔到ida,shift+F12没找到flag

image-20241012102518674

f5找到main(当然你也可以一开始就F5然后一直点进函数内部也可以到main)

image-20241012102237500

关键是这段

image-20241012102314226

解释一下,就是只要不全为1就会一直循环,全为1则执行sub_457AB4();,注意sub_457AB4();是在循环外部,不在里面。

点进sub_457AB4();

最后到达这:

image-20241012104844311

return的应该是flag

我们把这段伪代码转成python去运行得到flag:

注意qmemcpy(v2, “{ “, 2);中已经给a[0]和a[1]赋值了{的asc为123, “ “为32

1
2
3
4
5
6
7
8
9
10
11
12
13
14
a = [123, 32, 18, 98, 119, 108, 65, 41, 124, 80, 125, 38, 124, 111, 74, 49, 83, 108, 94, 108, 84, 6]
b = [18, 64, 98, 5, 2, 4, 6, 3, 6, 48, 49, 65, 32, 12, 48, 65, 31, 78, 62, 32,
49, 32, 1, 57, 96, 3, 21, 9, 4, 62, 3, 5, 4, 1, 2, 3, 44, 65, 78, 32,
16, 97, 54, 16, 44, 52, 32, 64, 89, 45, 32, 65, 15, 34, 18, 16, 0]

i = 0
c = ''
while i < 22:
a[i] ^= b[i]
a[i] ^= 0x13
c+=chr(a[i])
i+=1

print(c)

得到:zsctf{T9is_tOpic_1s_v5

只得到了一半,但是很奇怪程序中没有用到v3,可以尝试下v3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
b = [18, 64, 98, 5, 2, 4, 6, 3, 6, 48, 49, 65, 32, 12, 48, 65, 31, 78, 62, 32,
49, 32, 1, 57, 96, 3, 21, 9, 4, 62, 3, 5, 4, 1, 2, 3, 44, 65, 78, 32,
16, 97, 54, 16, 44, 52, 32, 64, 89, 45, 32, 65, 15, 34, 18, 16, 0]

a = [96, 83, 44, 121, 104, 110, 32, 95, 117, 101, 99, 123, 127, 119, 96, 48, 107, 71, 92, 29, 81, 107, 90, 85, 64, 12, 43, 76, 86, 13, 114, 1]

i = 0
c = ''
while i < 32:
a[i] ^= b[i + 22]
a[i] ^= 0x13
c+=chr(a[i])
i+=1

print(c)

ry_int7resting_b6t_others_are_n0

还有v4:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
a = [117, 126]

b = [18, 64, 98, 5, 2, 4, 6, 3, 6, 48, 49, 65, 32, 12, 48, 65, 31, 78, 62, 32,
49, 32, 1, 57, 96, 3, 21, 9, 4, 62, 3, 5, 4, 1, 2, 3, 44, 65, 78, 32,
16, 97, 54, 16, 44, 52, 32, 64, 89, 45, 32, 65, 15, 34, 18, 16, 0]

i = 0
c = ''
while i < 2:
a[i] ^= b[i + 54]
a[i] ^= 0x13
c+=chr(a[i])
i+=1

print(c)

t}

拼接得到zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}

==这道题应该被改过了,我也不清楚为什么这样明明没用到v3,v4最后还会输出,(可能是需要动态debug)==

解法三:

修改值,输入2,发现1,2,3都是亮的,可以修改判定条件,使用keypatch修改

image-20241012152552109

改成这样,就能跳出循环:

image-20241012152616474

输入2直接出flag

image-20241012152723629