CrackMe-crackhead

打开软件

PEID检查一下
查壳
用汇编写的,难怪这么小。

输入1234566 点击Check It, 没反应,输入别的数字 没反应、 不能输入字母。
看来问题出在了输入的数据上。而且输入的应该就是一串数字。

没有关键字搜索。但是可以从windows API来考虑。
GetDlgItemText 和 GetWindowText 都是常用来获取数据的。

查看一下当前程序使用到的API

找到了。GetWindowTextA

分别查看各自的汇编代码 显然第一个是我们要找的断点。

00401316  |.  6A 28         push 0x28                                ; /Count = 28 (40.)
00401318  |.  68 C4334000   push CrackHea.004033C4                   ; |Buffer = CrackHea.004033C4
0040131D  |.  FF35 90314000 push dword ptr ds:[0x403190]             ; |hWnd = NULL
00401323  |.  E8 4C010000   call <jmp.&USER32.GetWindowTextA>        ; \GetWindowTextA
00401328  |.  E8 A5000000   call CrackHea.004013D2                   ;  这是干嘛的
0040132D  |.  3BC6          cmp eax,esi                              ;  这个地方要返回zf=0 也就是eax=esi
0040132F  |.  75 42         jnz short CrackHea.00401373
00401331  |.  EB 2C         jmp short CrackHea.0040135F
00401333  |.  4E 6F 77 20 7>ascii "Now write a keyg"
00401343  |.  65 6E 20 61 6>ascii "en and tut and y"
00401353  |.  6F 75 27 72 6>ascii "ou're done.",0
0040135F  |>  6A 00         push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL
00401361  |.  68 0F304000   push CrackHea.0040300F                   ; |Title = "Crudd's Crack Head"
00401366  |.  68 33134000   push CrackHea.00401333                   ; |Text = "Now write a keygen and tut and you're done."
0040136B  |.  FF75 08       push [arg.1]                             ; |hOwner = 7FFDF000
0040136E  |.  E8 19010000   call <jmp.&USER32.MessageBoxA>           ; \MessageBoxA

同时我们也发现了可疑call

0040132D |. 3BC6 cmp eax,esi ; 这个地方要返回zf=0 也就是eax=esi

此处下断 输入1234566,运行跟进。

004013D2  /$  56            push esi
004013D3  |.  33C0          xor eax,eax
004013D5  |.  8D35 C4334000 lea esi,dword ptr ds:[0x4033C4]          ;  这个地方存的是输入的数据
004013DB  |.  33C9          xor ecx,ecx                              ;  user32.75AE714E
004013DD  |.  33D2          xor edx,edx
004013DF  |.  8A06          mov al,byte ptr ds:[esi]                 ;  取第一位
004013E1  |.  46            inc esi                                  ;  指针+1
004013E2  |.  3C 2D         cmp al,0x2D                              ;  和-比较 不是-  跳
004013E4  |.  75 08         jnz short CrackHea.004013EE
004013E6  |.  BA FFFFFFFF   mov edx,-0x1
004013EB  |.  8A06          mov al,byte ptr ds:[esi]
004013ED  |.  46            inc esi
004013EE  |>  EB 0B         jmp short CrackHea.004013FB
004013F0  |>  2C 30         /sub al,0x30                             ;  al减去0x30 其实就是取数字的值
004013F2  |.  8D0C89        |lea ecx,dword ptr ds:[ecx+ecx*4]        ;   ecx=ecx*5
004013F5  |.  8D0C48        |lea ecx,dword ptr ds:[eax+ecx*2]        ;   ecx=eax+ecx*2
004013F8  |.  8A06          |mov al,byte ptr ds:[esi]                ;  取下一位数据
004013FA  |.  46            |inc esi                                 ;  指针后移
004013FB  |>  0AC0           or al,al
004013FD  |.^ 75 F1         \jnz short CrackHea.004013F0             ;  al 不是 0 就跳转,是0就继续向下执行
004013FF  |.  8D040A        lea eax,dword ptr ds:[edx+ecx]
00401402  |.  33C2          xor eax,edx
00401404  |.  5E            pop esi                                  ;  CrackHea.0040132D
00401405  |.  81F6 53757A79 xor esi,0x797A7553
0040140B  \.  C3            retn

看到这个函数就明白了。
它首先检查是正数还是负数,然后依次从我们输入的数字字符串 从高位遍历到最低位。每次用ecx来存储累计的值。 ecx=10*ecx+eax; 一直循环到最低位。
其实这个循环的作用就是把我们输入的数字字符串转成对应的数值。、
如果我们输入的是正数的话,edx就是0,经过xor后还是eax本身,
然后pop esi,此时esi是0,然后对esi进行xor,esi的值就是0x797A7553

最后我们retn返回后,比较eax和esi的值是否相等,esi值到最后得出是固定的,eax的值就是我们输入的数字字符串的数值形式,所以只要输入 0x797A7553 的数值形式即可,

所以我们输入的数字应该是 2038068563

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 [安全攻防进阶篇] 中,有关于逆向分析的教程可以帮助你了解如何使用OllyDbg逆向CrackMe程序。 OllyDbg是一种常用的逆向工具,可以用于分析和修改程序的执行流程和内存。使用内存断点和普通断点,可以在程序执行过程中捕获关键的代码位置,帮助我们找到CrackMe程序的OEP(Original Entry Point),即程序的入口点。 在 [安全攻防进阶篇] 中还有关于逆向分析两个CrackMe程序的详细教程,包括逆向分析和源码还原的步骤。这些教程将帮助你理解逆向分析的基本概念和技巧,提升你的安全能力。 如果你想深入学习如何使用OllyDbg逆向CrackMe程序,可以参考这些教程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [[安全攻防进阶篇] 六.逆向分析之OllyDbg逆向CrackMe01-02及加壳判断](https://blog.csdn.net/Eastmount/article/details/107777190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [逆向crackme之ESp定律脱壳](https://blog.csdn.net/qq_58970968/article/details/125357834)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值