Deceptive world

这不是真正的入口 发现侧栏里面还有个main

程序逻辑分析:
整型数据v3 v4 v8
任意长度字符串 v5
Str1[3] 三字节
赋值v8 =0
执行 sub_1400010EB() 传参 v3 Str1 //不知道干什么的 后面分析 大概率是一个输入函数
输出 aGZLzLgVlxvjgZL (变量 数值是 G{z`Lz`Lg{vLxvjG{z`Lz`Lg{vLxvjxvj22)
执行 sub_140001017() 传参 Str1
v4赋值 strcmp() 传参 Str1 Str2 应该是得到了一个布尔型变量
猜测 如果strcmp得到了正确的值 会给v4赋值false
v5赋值 根据情况判断
执行 sub_14000113B 猜测这里根据v5的值来输出flag
sub_1400010EB() 逻辑分析
发现他去调用了sub_1400011D3
sub_1400011D3里面还有个sub_140001207
观察发现,这条链实际上是一个等效scanf 就是把scanf的内容赋值给Str1


sub_140001017() 逻辑分析
Str[i] ^= aGZLzLgVlxvjgZL[i];
等价于
Str[i] = Str[i] ^ aGZLzLgVlxvjgZL[i];
也就是把 Str的第i个字符与 aGZLzLgVlxvjgZL的第i个字符进行二进制异或运算并赋值给Str[i]
(断点调试得到 This_is_the_keyThis_is_the_keykey!!)

strcmp只是比较两个字符串是否相等,相等就触发接下来的一系列操作
可能输出flag
构造payload
Str2 = [
0x02,0x21,0x2D,0x32,0x0D,0x12,0x32,0x00,0x10,
0x11,0x2B,0x6B,0x06,0x54,0x1A,0x0B,0x1F,
0x59,0x01,0x33,0x0D,0x2C,0x6E,0x07,0x37,
0x07,0x6C,0x0A,0x10,0x0D,0x5A,0x03,0x0C,
0x4D,0x5C
]
# key 从 IDA 数据段拿出来的完整字符串
Key = b"This_is_the_keyThis_is_the_keykey!!"
flag_bytes = bytearray()
for i in range(len(Str2)):
flag_bytes.append(Str2[i] ^ Key[i])
print("Flag bytes:", flag_bytes)
print("Flag string:", flag_bytes.decode(errors="ignore"))
flag VIDAR{A_dyN4m1c_w0rld_1s_b3aut1ful}
正文完