这是一道win32 console的逆向。
主函数相对清晰:
上图两个重点,1是输入长度为32位、2是一个加密函数。
这里均是用动态调试去看的,因为函数本身较为复杂,直接静态分析有点困难。
通过动态调试下内存断点,查看数据的操作:
主函数中有一个异或,那个复杂的加密函数中还是一个异或:
*中途对数据进行了转移:
*下图为第二次异或操作:
*同样提出数据:
然后提出最后需要比较的数据,在局部变量之中:
提出来:
然后开始写脚本(跟到这里我已经累得不行了...):
1 aim = [0xB3,0x37,0x0F,0xF8,0xBC,0xBC, 2 0xAE,0x5D,0xBA,0x5A,0x4D,0x86,0x44, 3 0x97,0x62,0xD3,0x4F,0xBA,0x24,0x16, 4 0x0B,0x9F,0x72,0x1A,0x65,0x68,0x6D, 5 0x26,0xBA,0x6B,0xC8,0x67] 6 7 xor2 = [0x86,0x0C,0x3E,0xCA,0x98,0xD7,0xAE,0x19,0xE2,0x77,0x6B,0xA6,0x6A,0xA1,0x77,0xB0,0x69,0x91,0x37,0x05,0x7A,0xF9,0x7B,0x30,0x43,0x5A,0x4B,0x10,0x86,0x7D,0xD4,0x28] 8 xor1 = list('SWPU_2019_CTFSWPU_2019_CTFSWPU_2') 9 10 flag0 = [] 11 for i in range(32): 12 flag0.append(xor2[i] ^ aim[i]) 13 14 15 flag = [] 16 for i in range(32): 17 flag.append(chr(ord(xor1[i]) ^ flag0[i])) 18 19 print(''.join(flag))
得到flag。
这是我第一次使用内存断点,学到了。