第二个CrackMe
本帖最后由 Pammer 于 2020-4-1 18:55 编辑之前的CrackMe被人破了,然后又抽出来点儿时间做出来这个CM,请各位破解吧!{:301_997:}
CrackMe有解,但是自己破不出来(结果是随机的),所以没法附图,对不起{:301_1008:}
CM:
看看到了一定的人数公开源代码。
3个人已经破解完了,把这个代码也公开吧!
看ida的结果,只要有break的那个if不执行,给他nop掉,程序即可爆破成功,也就是沙发大哥图片中的那个比较eax和ecx的下面的那个jnz,nop就可以了{:301_975:} 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;
} 1. 在“输入密码” 那里下断点,查看 的内存,复制那十一个字节
2. 然后再用每个字节加上 0x21 ,
3. 程序放行 输入 key
上班无聊看一下,追注册码这玩意不擅长,还是推理爆破实在点{:301_1004:} paranioa 发表于 2020-4-2 03:07
1. 在“输入密码” 那里下断点,查看 的内存,复制那十一个字节
2. 然后再用每个字节加上 0x21 ...
您这是用的x64Dbg吧,我想请教一下,您是如何找到字符“请输入密码”的?x64Dbg好像没有智能搜索吧,而且我找地址找了半天也没找到,我真心想学这个,您能给我说一下详细一些的教程吗 本帖最后由 paranioa 于 2020-4-2 15:26 编辑
Bluezzz 发表于 2020-4-2 07:59
您这是用的x64Dbg吧,我想请教一下,您是如何找到字符“请输入密码”的?x64Dbg好像没有智能搜索吧, ...
你要搜索中文的话装这个插件 https://www.52pojie.cn/thread-527699-1-1.html
paranioa 发表于 2020-4-2 15:21
你要搜索中文的话装这个插件 https://www.52pojie.cn/thread-527699-1-1.html
OK,谢谢啦,那我再试试 小菜鸟一枚 发表于 2020-4-1 17:47
1.还是直接搜索字符串,回车来到失败的地方
010D13D0 .8B0D 70300D01 mov ecx, ...
感觉这个方法最简单易懂 学习了
页:
[1]