ReverseMe来自https://www.52pojie.cn/thread-816369-1-1.html
今天晚自习闲来无事,发现haoj好久没有玩过有意思的CM了,在吾爱发现了一个有意思的CM
准备工具:Ollydbg,Exeinfope,解压工具
Ollydbg载入
字符串定位关键算法
00B91059 2BCA sub ecx,edx
00B9105B 83F9 12 cmp ecx,0x12
00B9105E 74 15 je short gift.00B91075
00B91060 68 1C21B900 push gift.00B9211C ; 长度错误\n
00B91065 E8 16010000 call gift.00B91180
00B9106A 83C4 04 add esp,0x4
00B9106D 6A 00 push 0x0
00B9106F FF15 7820B900 call dword ptr ds:[<&api-ms-win-crt-runt>; ucrtbase.exit
00B91075 56 push esi
00B91076 33C9 xor ecx,ecx
00B91078 BE 0B000000 mov esi,0xB
00B9107D 0F1F ??? ; 未知命令
00B9107F 008B C199F7FE add byte ptr ds:[ebx+0xFEF799C1],cl
00B91085 8A82 F820B900 mov al,byte ptr ds:[edx+0xB920F8] ; h3ll0_w0rld
00B9108B 32840D FCFEFFFF xor al,byte ptr ss:[ebp+ecx-0x104]
00B91092 F6D0 not al
00B91094 3285 0CFFFFFF xor al,byte ptr ss:[ebp-0xF4]
00B9109A 3285 0DFFFFFF xor al,byte ptr ss:[ebp-0xF3]
00B910A0 88840D FCFEFFFF mov byte ptr ss:[ebp+ecx-0x104],al
00B910A7 41 inc ecx
00B910A8 83F9 10 cmp ecx,0x10
00B910AB ^ 7C D3 jl short gift.00B91080
00B910AD B9 1830B900 mov ecx,gift.00B93018
00B910B2 8D95 FCFEFFFF lea edx,dword ptr ss:[ebp-0x104]
00B910B8 BE 0C000000 mov esi,0xC
00B910BD 0F1F ??? ; 未知命令
00B910BF 008B 013B0275 add byte ptr ds:[ebx+0x75023B01],cl
00B910C5 2F das
00B910C6 83C1 04 add ecx,0x4
00B910C9 83C2 04 add edx,0x4
00B910CC 83EE 04 sub esi,0x4
00B910CF ^ 73 EF jnb short gift.00B910C0
00B910D1 0FBE8D 0CFFFFFF movsx ecx,byte ptr ss:[ebp-0xF4]
00B910D8 0FBE95 0DFFFFFF movsx edx,byte ptr ss:[ebp-0xF3]
00B910DF 8BC1 mov eax,ecx
00B910E1 2BC2 sub eax,edx
00B910E3 83F8 04 cmp eax,0x4
00B910E6 75 0D jnz short gift.00B910F5
00B910E8 8D040A lea eax,dword ptr ds:[edx+ecx]
00B910EB 83F8 6A cmp eax,0x6A
00B910EE B8 2821B900 mov eax,gift.00B92128 ; 压缩包密码正确!等等,压缩包在哪里呢?\n
00B910F3 74 05 je short gift.00B910FA
00B910F5 B8 5021B900 mov eax,gift.00B92150 ; 密码错误\n
00B910FA 50 push eax
00B910FB E8 80000000 call gift.00B91180
00B91100 8B4D FC mov ecx,dword ptr ss:[ebp-0x4]
00B910D1 0FBE8D 0CFFFFFF movsx ecx,byte ptr ss:[ebp-0xF4]
00B910D8 0FBE95 0DFFFFFF movsx edx,byte ptr ss:[ebp-0xF3]
00B910DF 8BC1 mov eax,ecx
00B910E1 2BC2 sub eax,edx
00B910E3 83F8 04 cmp eax,0x4
00B910E6 75 0D jnz short gift.00B910F5
00B910E8 8D040A lea eax,dword ptr ds:[edx+ecx]
00B910EB 83F8 6A cmp eax,0x6A
00B910EE B8 2821B900 mov eax,gift.00B92128 ; 压缩包密码正确!等等,压缩包在哪里呢?\n
00B910F3 74 05 je short gift.00B910FA
00B910F5 B8 5021B900 mov eax,gift.00B92150 ; 密码错误\n
可得知注册码后两位的关系
a-b=4
a+b=106
我们可以轻易解出
b=51
a=55
可知最后两位为"73"
00B91080 8BC1 mov eax,ecx
00B91082 99 cdq
00B91083 F7FE idiv esi
00B91085 8A82 F820B900 mov al,byte ptr ds:[edx+0xB920F8] ; h3ll0_w0rld
00B9108B 32840D FCFEFFFF xor al,byte ptr ss:[ebp+ecx-0x104]
00B91092 F6D0 not al
00B91094 3285 0CFFFFFF xor al,byte ptr ss:[ebp-0xF4]
00B9109A 3285 0DFFFFFF xor al,byte ptr ss:[ebp-0xF3]
00B910A0 88840D FCFEFFFF mov byte ptr ss:[ebp+ecx-0x104],al
00B910A7 41 inc ecx
00B910A8 83F9 10 cmp ecx,0x10
00B910AB ^ 7C D3 jl short gift.00B91080
Key每位,"h3ll0_w0rld",注册码后两位 xor not xor 得到的数据为
0xa4, 0x8a, 0xae, 0xa7, 0xfb, 0x93, 0xba, 0x88, 0xbd, 0xd2, 0xda, 0xa1, 0xff, 0xaf, 0xd2, 0xfd, 0x00
因此我们将他的数据解密即可得到正确的Key
下面给出C代码
int main()
{
byte data[] =
{
0xa4, 0x8a, 0xae, 0xa7, 0xfb, 0x93, 0xba, 0x88, 0xbd, 0xd2, 0xda, 0xa1, 0xff, 0xaf, 0xd2, 0xfd, 0x00
};
char table[] = "h3ll0_w0rldh3ll0";
for (int i = 0; i < 16; i++) {
data[i] = data[i] ^ 0x33;
data[i] = data[i] ^ 0x37;
data[i] = ~data[i];
data[i] = data[i] ^ table[i];
}
printf("%s\n", data);
system("pause");
return 0;
}
求出Key为 7B90076C4EE278E673
密码正确,收工.