看到别人的wp都说有壳,不知道为什么我的PEid查不出来壳的具体种类,运行程序,输入错误则退出。
IDA中,函数有几百个一个一个找核心函数肯定不现实,OD动态调试,找到 “你赢了”:
向上翻,找到函数的开头CB1BB0
向下翻,找到5个集中跳转:
既然题目是密码破解,肯定是和加密算法有关的,所以要分析一下这5个jnz上面的具体操作:
动态调试,首先将输入的“123456789”赋值给eax:
上一个指令算出0x12,下一步右移1位,算出输入字符的长度9:
WideCharToMultiByte :将unicode字符串转换到一个多字节字符串
效果:
分析一下之后发现就是eax和ecx的加和构成的内存地址的访问,之后再与eax进行异或操作:
计算一下eax+acx,得到内存数据:28 57 64 6B 93 8F 65 51 E3 53 E4 4E 1A FF
再根据5个关键跳转,得到内存数据:1B 1C 17 46 F4 FD 20 30 B7 0C 8E 7E 78 DE
再往下看看还有没有别的操作。。
分析:对eax和 ptr [eax+ecx] 的内容进行异或操作结果要等于关键跳转处的数据,而异或操作可以逆向计算的,所以可以写个脚本,让两处的数据进行异或。
b1 = [0x1B,0x1C,0x17,0x46,0xF4,0xFD,0x20,0x30,0xB7,0x0C,0x8E,0x7E,0x78,0xDE]
b2 = [0x28,0x57,0x64,0x6B,0x93,0x8F,0x65,0x51,0xE3,0x53,0xE4,0x4E,0x1A,0xFF]
flag = ""
for i in range(0,len(b1)):
flag += chr(b1[i]^b2[i])
print(flag)