re | [SWPU2019]ReverseMe

这是一道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。

这是我第一次使用内存断点,学到了。

原文地址:https://www.cnblogs.com/Mz1-rc/p/13756728.html