下载发附件后拖入ida
从主函数分析起
主函数可以得到如下信息:
1.调用了一个函数 sub_A90()
2.用户输入字符串s
3. s1与 s 异或
打开sub_A90()分析
s1 与 s2 进行比较,如果相等则正确
判断该函数为一个回调函数(在程序结束执行时(即主函数或程序的入口点返回后),可能会有一些清理工作需要进行,如释放资源、保存状态等。这些工作可能通过回调函数的形式进行,尽管它们不直接由主函数“调用”,但可能在主函数返回后由运行时环境或操作系统触发。)
所以初步判断 s1与s进行异或 与 v2相等 s即是我们得到的flag
v1 = "qasxcytgsasxcvrefghnrfghnjedfgbhn"
v2 = [0X56,0X4e,0X57,0X58,0X51,0X51,0X39,0X46,
0x17,0x46,0x54,0x5A,0x59,0x59,0x1F,0x48,0x32,
0x5B,0x6B,0x7C,0x75,0x6E,0x7E,0x6E,0x2F,0x77,
0x4F,0x7A,0x71,0x43,0x2B,0x26,0x89,0xFE,0x00]
flag = ''
# v2 与 flag 异或后为 v1
for i in range(33):
flag += chr(ord(v1[i])^v2[i])
print(flag)
得到的是一堆乱码,显然不正确
再返回 查看s1有无其它加密
打开s1后 Ctrl+x 发现sub_84A也使用了s1
打开该函数,发现还有一个异或
添加到脚本中
v1 = "qasxcytgsasxcvrefghnrfghnjedfgbhn"
v2 = [0X56,0X4e,0X57,0X58,0X51,0X51,0X39,0X46,
0x17,0x46,0x54,0x5A,0x59,0x59,0x1F,0x48,0x32,
0x5B,0x6B,0x7C,0x75,0x6E,0x7E,0x6E,0x2F,0x77,
0x4F,0x7A,0x71,0x43,0x2B,0x26,0x89,0xFE,0x00]
flag = ''
# v2 与 flag 异或后为 v1
for i in range(33):
flag += chr(ord(v1[i])^v2[i]^(2 * i + 65))
print(flag)
得到 flag{c0n5truct0r5_functi0n_in_41f}