-
-
[原创]第三题 crackMe 新手分析
-
2017-10-28 18:25 2304
-
1. OD打开直接退出
2. OD附加可以
3. 下GetDlgItemTextA的断点, 找到以下函数
显然MessageBoxA(0, "ok", "CrackMe", 0);是我们的目标
v4 = GetDlgItemTextA(hDlg, 1001, &String, 1025); v25 = sub_29DE51(&v11 == &v11, v4); v19 = 0; sub_29D5E6(&v20, 0, 1023); sub_29D267(&String, 1024, &v21); v17 = 0; sub_29D5E6(&v18, 0, 1023); sub_29D267(&v21, 1024, &v19); sub_29D96A(&v19, &v17, 1024); v16 = 3; will_exit_func((int)&v19, 3, (int)v15); for ( i = 0; i < 32; ++i ) sub_29DF05(&formated_cc_64[2 * i], "%02x", (unsigned __int8)v15[i]); maybe_length_64 = strlen(formated_cc_64); string_end = &String + strlen(&String); len_format_cc_64 = strlen(formated_cc_64); if ( !j_real_first_check((int)formated_cc_64, (int)&string_end[-len_format_cc_64], maybe_length_64) ) { sub_29D0B4(); if ( (unsigned __int8)sub_29D9AB((int)&unk_30B000, (int)&v17) == 1 ) { v8 = MessageBoxA(0, "ok", "CrackMe", 0); sub_29DE51(&v11 == &v11, v8); } }
GetDlgItemTextA到will_exit_func之间的函数并不会决定是否弹出ok对话框,所以先决定不管。
运行发现will_exit_func会导致进程退出,貌似是有反调试,先NOP掉
发现formated_cc_64会被填充64个’c’
通过检查返回值发现其中一个函数是strlen
强制让j_real_first_check返回0,发现运行sub_29D0B4()就能弹出ok了,没有什么额外的条件了,所以j_real_first_check就是真正的验证函数。其实这里应该猜一猜,第一个参数是64个’c’,第二个参数是输入字符串的结尾减64的地址,第三个参数是长度64。很容易猜到是字符串比较,虽然我是后来进去分析了一下才看出来的。。。
4. 不过cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc看起来就不太对,感觉 will_exit_func 会做点什么出了反调试之外有意义的事情
进去发现以下代码运行到int3会导致进程结束,所以NOP掉这个函数
002A1070 > \55 push ebp 002A1071 . 8BEC mov ebp,esp 002A1073 . 81EC CC000000 sub esp,0xCC 002A1079 . 53 push ebx 002A107A . 56 push esi 002A107B . 57 push edi 002A107C . 8DBD 34FFFFFF lea edi,dword ptr ss:[ebp-0xCC] 002A1082 . B9 33000000 mov ecx,0x33 002A1087 . B8 CCCCCCCC mov eax,0xCCCCCCCC 002A108C . F3:AB rep stos dword ptr es:[edi] 002A108E . 33C0 xor eax,eax 002A1090 . 99 cdq 002A1091 . 68 B3102A00 push crackMe.002A10B3 002A1096 . 64:FF30 push dword ptr fs:[eax] 002A1099 . 64:8920 mov dword ptr fs:[eax],esp 002A109C CC int3
总共有3个这样的函数,都NOP掉
002A6777 |. C740 20 4DEE8>mov dword ptr ds:[eax+0x20],0xE38DEE4D 002A677E |. 8B45 08 mov eax,[arg.1] 002A6781 |. C740 24 4E0EF>mov dword ptr ds:[eax+0x24],0xB0FB0E4E 002A6788 |. C745 F8 00000>mov [local.2],0x0 002A678F E8 E972FFFF call crackMe.0029DA7D ; 这里退出 NOP掉 002A6794 |. 8945 F8 mov [local.2],eax 002A6797 |. 837D F8 01 cmp [local.2],0x1 002A679B |. 75 0A jnz short crackMe.002A67A7 002A679D |. 6A 00 push 0x0 002A679F |. E8 E278FFFF call crackMe.0029E086 002A67A4 |. 83C4 04 add esp,0x4 002A67A7 E8 DD6BFFFF call crackMe.0029D389 ; 这里退出 NOP掉 002A67AC |. C745 F8 00000>mov [local.2],0x0 002A67B3 |. E8 4F70FFFF call crackMe.0029D807 002A67B8 |. 8945 F8 mov [local.2],eax 002A67BB |. 837D F8 01 cmp [local.2],0x1 002A67BF 75 0A jnz short crackMe.002A67CB 002A67C1 |. 6A 00 push 0x0 002A67C3 E8 BE78FFFF call crackMe.0029E086 ; 这里退出 NOP掉 002A67C8 |. 83C4 04 add esp,0x4
5. 解决掉反调试之后,断点到j_real_first_check然后发现其中一个参数是
“183920f00e15a0433ee3a8fc90dd9ac164c4142ccf63ca189a8f645ec96ff8de”
很有可能就是password,试运行一下,果然ok!
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界