Pammer 发表于 2020-4-1 14:50

第二个CrackMe

本帖最后由 Pammer 于 2020-4-1 18:55 编辑

之前的CrackMe被人破了,然后又抽出来点儿时间做出来这个CM,请各位破解吧!{:301_997:}
CrackMe有解,但是自己破不出来(结果是随机的),所以没法附图,对不起{:301_1008:}

CM:
看看到了一定的人数公开源代码。
3个人已经破解完了,把这个代码也公开吧!

玖公子 发表于 2020-4-1 18:46

看ida的结果,只要有break的那个if不执行,给他nop掉,程序即可爆破成功,也就是沙发大哥图片中的那个比较eax和ecx的下面的那个jnz,nop就可以了{:301_975:}

小菜鸟一枚 发表于 2020-4-1 17:47

1.还是直接搜索字符串,回车来到失败的地方
010D13D0   .8B0D 70300D01 mov ecx,dword ptr ds:[<&MSVCP140.std::co>;msvcp140.std::cout
010D13D6   .BA 54320D01   mov edx,CrackMe.010D3254               ;破解成功,感谢您的参与!
010D13DB   .68 90170D01   push CrackMe.010D1790
010D13E0   .E8 6B010000   call CrackMe.010D1550
010D13E5   .8BC8          mov ecx,eax                              ;ucrtbase.668A2108
010D13E7   .FF15 54300D01 call dword ptr ds:[<&MSVCP140.std::basic>;msvcp140.std::basic_ostream<wchar_t,std::char_traits<wchar_t> >::operator<<
010D13ED   .C3            retn
010D13EE      CC            int3
010D13EF      CC            int3
010D13F0   .8B0D 70300D01 mov ecx,dword ptr ds:[<&MSVCP140.std::co>;msvcp140.std::cout
010D13F6   .BA 70320D01   mov edx,CrackMe.010D3270               ;破解失败,请继续加油!
010D13FB   .68 90170D01   push CrackMe.010D1790
010D1400   .E8 4B010000   call CrackMe.010D1550
010D1405   .8BC8          mov ecx,eax                              ;ucrtbase.668A2108
010D1407   .FF15 54300D01 call dword ptr ds:[<&MSVCP140.std::basic>;msvcp140.std::basic_ostream<wchar_t,std::char_traits<wchar_t> >::operator<<
010D140D   .C3            retn



2.010D13D0 这个是成功的call,.010D13F0 这个是失败的call,通过字符串“请输入密码”定位到call eax这个地方调用
010D1334|.B8 D0130D01   |mov eax,CrackMe.010D13D0
010D1339|.8945 B8       |mov ,eax
010D133C|.3BFE          |cmp edi,esi
010D133E|.^ 72 C4         \jb short CrackMe.010D1304
010D1340|.EB 09         jmp short CrackMe.010D134B
010D1342|>B8 F0130D01   mov eax,CrackMe.010D13F0
010D1347|.EB 02         jmp short CrackMe.010D134B
010D1349|>33C0          xor eax,eax
010D134B|>FFD0          call eax



3.直接将mov eax,0x10D13F0改为mov eax,0x10D13D0即可爆破成功


PS:我只会爆破是在追不出来它的密码,就这样了,以下仅为猜测

/*
使用时间播种,生成随机数

v10保存下一个goto跳转的地址
*/
v3 = time64(0);
srand(v3);

if ( v0 )    //v0我输入的值
{
    while ( 1 )
    {
      v8 = &Src;
      v9 = (char *)&Memory;
      if ( v1 >= 0x10 )
      v8 = v6;
      if ( v18 >= 0x10 )
      v9 = (char *)Memory;
      v6 = (void **)v9;
      if ( (void **)(*((char *)v8 + v7) + 33) != v6 || v15 == sub_4013F0 )
      break;
      v6 = (void **)Src;
      ++v7;
      v10 = (int (*)())sub_4013D0;
      v15 = (int (*)())sub_4013D0;
      if ( v7 >= v0 )
      goto LABEL_19;
    }
    v10 = sub_4013F0;
}
else   
{
    v10 = 0;
}

paranioa 发表于 2020-4-2 03:07

1. 在“输入密码” 那里下断点,查看 的内存,复制那十一个字节
2. 然后再用每个字节加上 0x21 ,
3. 程序放行 输入 key

GJH588 发表于 2020-4-1 15:44

上班无聊看一下,追注册码这玩意不擅长,还是推理爆破实在点{:301_1004:}

Bluezzz 发表于 2020-4-2 07:59

paranioa 发表于 2020-4-2 03:07
1. 在“输入密码” 那里下断点,查看 的内存,复制那十一个字节
2. 然后再用每个字节加上 0x21 ...

您这是用的x64Dbg吧,我想请教一下,您是如何找到字符“请输入密码”的?x64Dbg好像没有智能搜索吧,而且我找地址找了半天也没找到,我真心想学这个,您能给我说一下详细一些的教程吗

paranioa 发表于 2020-4-2 15:21

本帖最后由 paranioa 于 2020-4-2 15:26 编辑

Bluezzz 发表于 2020-4-2 07:59
您这是用的x64Dbg吧,我想请教一下,您是如何找到字符“请输入密码”的?x64Dbg好像没有智能搜索吧, ...
你要搜索中文的话装这个插件 https://www.52pojie.cn/thread-527699-1-1.html

Bluezzz 发表于 2020-4-2 15:51

paranioa 发表于 2020-4-2 15:21
你要搜索中文的话装这个插件 https://www.52pojie.cn/thread-527699-1-1.html

OK,谢谢啦,那我再试试

a3361920 发表于 2020-4-8 17:09

小菜鸟一枚 发表于 2020-4-1 17:47
1.还是直接搜索字符串,回车来到失败的地方
010D13D0   .8B0D 70300D01 mov ecx, ...

感觉这个方法最简单易懂 学习了
页: [1]
查看完整版本: 第二个CrackMe