把文件拖入IDA
shift+F12查看可疑字符串 看到flag 继续跟进
查看主函数 F5查看伪c代码
这个程序是一个简单的谜题或挑战,要求用户输入一个长度为33的字符串,该字符串经过特定的处理(使用dword_40F040
数组作为索引和异或密钥)后,必须与byte_40F0E0
数组中的值完全匹配。成功匹配后,程序会打印出用户的输入作为“标志”,并结束。
第一个for循环遍历Str
的每个字符。对于每个字符,它使用dword_40F040[i]
作为索引从Str
中取出字符,然后将这个字符赋值给byte_414040[i]
,并对这个字符进行异或操作,异或的值为dword_40F040[i]
的低字节(LOBYTE(dword_40F040[i])
)。
找到dword_40F040和byte_40F0E0的值
这个加密的思路是将str先赋值再异或
那逆向的思路是先异或再赋值
编写反脚本
# 定义字节和 dword 数组
byte_40f0e0 = [0x67, 0x79, 0x7B, 0x7F, 0x75, 0x2B, 0x3C, 0x52, 0x53, 0x79, 0x57, 0x5E, 0x5D, 0x42, 0x7B, 0x2D, 0x2A, 0x66, 0x42, 0x7E, 0x4C, 0x57, 0x79, 0x41, 0x6B, 0x7E, 0x65, 0x3C, 0x5C, 0x45, 0x6F, 0x62, 0x4D]
dword_40F040 = [0x09, 0x0A, 0x0F, 0x17, 0x07, 0x18, 0x0C, 0x06, 0x01, 0x10, 0x03, 0x11, 0x20, 0x1D, 0x0B, 0x1E, 0x1B, 0x16, 0x04, 0x0D, 0x13, 0x14, 0x15, 0x02, 0x19, 0x05, 0x1F, 0x08, 0x12, 0x1A, 0x1C, 0x0E, 0x00]
# 初始化结果字符串列表
Str = [0] * 33
# 进行异或操作并存储结果
for i in range(33):
Str[dword_40F040[i]] = byte_40f0e0[i] ^ dword_40F040[i]
# 将结果列表转换为字符串
flag = ''.join(chr(c) if c != 0 else '' for c in Str)
# 打印结果
print(flag)
得到flag
记得用flag{}包裹
flag{Tr4nsp0sltiON_Clph3r_1s_3z}