首页
社区
课程
招聘
[原创]第三题 crackMe 新手分析
2017-10-28 18:25 2304

[原创]第三题 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世界

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回