【ISCC 2023】Pull the Wool Over People's Eyes
收获
使用 OllyDBG 动态调试直接获取程序的中间数据
分析伪代码函数逻辑
(2023年5月1日-2023年5月25日)【ISCC 2023】Pull the Wool Over People’s Eyes
思路
定位到主函数:
代码比较长,先定位到输入的位置:sub_402190(std::cin, v35)
让用户输入 v35
sub_401650(Src, v22, v25)
用于生成一个 Src
,后面会用到
生成 Src
的逻辑如下:
虽然给出了生成 Src
的代码,但是这里可以通过 OllyDBG 动态调试直接得到 Src
的内容,在 sub_401650()
函数的返回值处,下一个断点即可
先找到 return Src;
这句的地址,在这一条指令处使用快捷键 TAB
:
在 OllyDBG 中打开,定位到该位置,在 IDA 中该地址为 0x004017DB
,在 OllyDBG 中为 0x000E17DB
F2
下断点
直接运行程序,输入的时候随便输入即可
在堆栈窗口中即可看到生成的 Src
的值为:ISCC{ACYeeeloorrsuv}
跟踪 Src
和 v35
的处理过程,观察到如下代码:
首先将输入 v35
赋值给 v4
,Src
赋值给 v5
其中,v3
为 v35
和 Src
的索引,v29
为 v6
的索引v7 = v4 + v3
指向 v35
v8 = v5 + v3
指向 Src
v6
指向 v35
*(v6 + v29) = *v8 ^ *v7
将 v35
和 Src
进行异或,即 v35[] = Src[] ^ v35[]
后面定义了一串 0 和 1 的字符串 v10
,并用一个 while() 循环比较 v9[]
和 v10[]
的值是否相等
若每一位都相等,则 v13 = 0
,输出 Right
由初值 v11 = 156
,v14 = v11 < 4
,当 v11 < 4
时结束循环
结合 Src = ISCC{ACYeeeloorrsuv}
长度为 20v10
长度为 160,每 8 位二进制作为一组与 Src
进行异或
即可得到 flag
脚本
key = "ISCC{ACYeeeloorrsuv}"
v10 = "0000000000000000000000000000000000000000011001000111001000101110001001110001010100000001000111110101110100101100000111010100101100100100010000010010000000000000"
num = []
for i in range(0, len(v10), 8):
t = ""
for j in range(8):
t += v10[i + j]
num.append(int(t, 2))
print(list(key))
print(num)
for i in range(len(num)):
print(chr(ord(key[i]) ^ num[i]), end="")
结果
ISCC