Jarvis OJ (逆向):软件密码破解-1

题目: 

Jarvis OJ (逆向):软件密码破解-1_第1张图片

看到别人的wp都说有壳,不知道为什么我的PEid查不出来壳的具体种类,运行程序,输入错误则退出。

             Jarvis OJ (逆向):软件密码破解-1_第2张图片

IDA中,函数有几百个一个一个找核心函数肯定不现实,OD动态调试,找到 “你赢了”:

Jarvis OJ (逆向):软件密码破解-1_第3张图片

向上翻,找到函数的开头CB1BB0

Jarvis OJ (逆向):软件密码破解-1_第4张图片

向下翻,找到5个集中跳转:

Jarvis OJ (逆向):软件密码破解-1_第5张图片

既然题目是密码破解,肯定是和加密算法有关的,所以要分析一下这5个jnz上面的具体操作:

动态调试,首先将输入的“123456789”赋值给eax:

Jarvis OJ (逆向):软件密码破解-1_第6张图片

上一个指令算出0x12,下一步右移1位,算出输入字符的长度9:

Jarvis OJ (逆向):软件密码破解-1_第7张图片

 

WideCharToMultiByte :将unicode字符串转换到一个多字节字符串

Jarvis OJ (逆向):软件密码破解-1_第8张图片

效果:

Jarvis OJ (逆向):软件密码破解-1_第9张图片

 

找到核心点:

分析一下之后发现就是eax和ecx的加和构成的内存地址的访问,之后再与eax进行异或操作:

Jarvis OJ (逆向):软件密码破解-1_第10张图片

计算一下eax+acx,得到内存数据:28 57 64 6B 93 8F 65 51 E3 53 E4 4E 1A FF

Jarvis OJ (逆向):软件密码破解-1_第11张图片

 

再根据5个关键跳转,得到内存数据:1B 1C 17 46 F4 FD 20 30 B7 0C 8E 7E 78 DE

Jarvis OJ (逆向):软件密码破解-1_第12张图片

再往下看看还有没有别的操作。。

Jarvis OJ (逆向):软件密码破解-1_第13张图片

分析:对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)

   

 

你可能感兴趣的:(逆向工程)