首页
社区
课程
招聘
[原创]最近无聊写了一个crackme!给新手玩玩,大牛飘过!
发表于: 2009-11-20 13:46 6413

[原创]最近无聊写了一个crackme!给新手玩玩,大牛飘过!

2009-11-20 13:46
6413
最好写一个注册机,写一篇分板文章给大家学习一下!

[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 290
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
用户名:Eddy1
注册码:Jii~6
2009-11-20 15:01
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
牛啊!一小时十五分就被破解了
2009-11-20 15:04
0
雪    币: 290
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好久没写文章了……,分析过程:http://www.rrgod.com/post/123.html

你这个估计1分钟就被人秒掉
2009-11-20 15:09
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
呵呵,文章都写出来了,分析的太好啊!
2009-11-20 15:14
0
雪    币: 388
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
支持一下
OD载入程序后 EIP是这里
00406640 >  B8 03214000     mov     eax, 00402103
00406645    8A38            mov     bh, byte ptr [eax]
00406647    B9 03110000     mov     ecx, 1103
0040664C    8A50 FF         mov     dl, byte ptr [eax-1]
0040664F    8810            mov     byte ptr [eax], dl
00406651    48              dec     eax
00406652  ^ E2 F8           loopd   short 0040664C
00406654    8838            mov     byte ptr [eax], bh
00406656  ^ FF25 5C664000   jmp     dword ptr [40665C]               ; crackme.
根据壳的运行原理 我们会知道它总会来到OEP的 所以在这里(我初学时用过的)F8单步走
我这里直接在关键的JMP 处下断点 这样能快点其实和F8单步是一个道理
00406656  ^\FF25 5C664000   jmp     dword ptr [40665C]               ; crackme.
00406636  ^\FF25 3C664000   jmp     dword ptr [40663C]               ; crackme.
00406616  - FF25 1C664000   jmp     dword ptr [40661C]               ; crackme.
可以发现程序会依次走过这几个JMP
直接F4到00406616就可以了 然后F8单步就走到OEP了
00401240      55            db      55                               ;  CHAR 'U'
00401241      89            db      89
00401242      E5            db      E5
00401243      83            db      83
00401244      EC            db      EC
00401245      08            db      08
00401246      C7            db      C7
00401247      04            db      04
00401248      24            db      24                               ;  CHAR '$'
00401249      02            db      02
0040124A      00            db      00
0040124B      00            db      00
0040124C      00            db      00
0040124D      FF            db      FF
0040124E      15            db      15
0040124F      2C614000      dd      <&msvcrt.__set_app_type>
00401253      E8            db      E8
00401254      A8            db      A8
00401255      FE            db      FE
00401256      FF            db      FF
00401257      FF            db      FF
00401258      90            nop
00401259      8D            db      8D
0040125A      B4            db      B4
0040125B      26            db      26                               ;  CHAR '&'
0040125C      00            db      00
0040125D      00            db      00
0040125E      00            db      00
0040125F      00            db      00
00401260   $  55            push    ebp
00401261   .  8B0D 44614000 mov     ecx, dword ptr [<&msvcrt.atexit>>;  msvcrt.atexit
00401267   .  89E5          mov     ebp, esp
00401269   .  5D            pop     ebp
这样看可能有点不舒服吧 其实只要根据F8单步走过语句,按下CTRL+A可以,F8单步也可以分析出应该是这样的结果
00401240      55            push    ebp
00401241      89E5          mov     ebp, esp
00401243      83EC 08       sub     esp, 8
00401246      C70424 020000>mov     dword ptr [esp], 2
0040124D      FF15 2C614000 call    dword ptr [<&msvcrt.__set_app_ty>;  msvcrt.__set_app_type
00401253   .  E8 A8FEFFFF   call    00401100
00401258   .  90            nop
00401259   .  8DB426 000000>lea     esi, dword ptr [esi]
00401260   $  55            push    ebp
00401261   .  8B0D 44614000 mov     ecx, dword ptr [<&msvcrt.atexit>>;  msvcrt.atexit
在OD中扫描一下字符串,就会发现我们想要的关键字符 SUCCESS(程序中的少了个C)
也可以用API函数来定位,都可以的
再输入完用户名和注册码后 我们在下面的GetDlgItemTextA下面来下断点F2
00401797  |.  E8 84080000   call    <jmp.&USER32.GetDlgItemTextA>    ; \GetDlgItemTextA
0040179C  |.  83EC 10       sub     esp, 10
0040179F  |.  8D85 C8FDFFFF lea     eax, dword ptr [ebp-238]
004017A5  |.  890424        mov     dword ptr [esp], eax
004017A8  |.  E8 27FBFFFF   call    004012D4                         ;  计算用户名长度
004017AD  |.  8985 C4FDFFFF mov     dword ptr [ebp-23C], eax         ; |
004017B3  |.  83BD C4FDFFFF>cmp     dword ptr [ebp-23C], 4           ; |小于5位就会提示用户名太短了
004017BA  |.  7F 27         jg      short 004017E3                   ; |
004017BC  |.  C74424 0C 000>mov     dword ptr [esp+C], 0             ; |
004017C4  |.  C74424 08 444>mov     dword ptr [esp+8], 00404044      ; |呵呵用户名太短!uuusucess!
004017CC  |.  C74424 04 494>mov     dword ptr [esp+4], 00404049      ; |用户名太短!uuusucess!
004017D4  |.  C70424 000000>mov     dword ptr [esp], 0               ; |
004017DB  |.  E8 50080000   call    <jmp.&USER32.MessageBoxA>        ; \MessageBoxA
004017E0  |.  83EC 10       sub     esp, 10
004017E3  |>  C785 C0FDFFFF>mov     dword ptr [ebp-240], 0
004017ED  |>  8B85 C0FDFFFF /mov     eax, dword ptr [ebp-240]
004017F3  |.  3B85 C4FDFFFF |cmp     eax, dword ptr [ebp-23C]
004017F9  |.  7D 2E         |jge     short 00401829                  ;  循环5次
004017FB  |.  8D45 F8       |lea     eax, dword ptr [ebp-8]
004017FE  |.  0385 C0FDFFFF |add     eax, dword ptr [ebp-240]        ;  
00401804  |.  8D90 D0FDFFFF |lea     edx, dword ptr [eax-230]
0040180A  |.  8D45 F8       |lea     eax, dword ptr [ebp-8]
0040180D  |.  0385 C0FDFFFF |add     eax, dword ptr [ebp-240]
00401813  |.  2D 30020000   |sub     eax, 230                        ;  
00401818  |.  0FB600        |movzx   eax, byte ptr [eax]             ;
0040181B  |.  04 05         |add     al, 5                           ;  关键 用户名计算 eax=name[i]+5
0040181D  |.  8802          |mov     byte ptr [edx], al
0040181F  |.  8D85 C0FDFFFF |lea     eax, dword ptr [ebp-240]
00401825  |.  FF00          |inc     dword ptr [eax]
00401827  |.^ EB C4         \jmp     short 004017ED
00401829  |>  C74424 0C F40>mov     dword ptr [esp+C], 1F4           ; |
00401831  |.  8D85 D8FEFFFF lea     eax, dword ptr [ebp-128]         ; |
00401837  |.  894424 08     mov     dword ptr [esp+8], eax           ; |
0040183B  |.  C74424 04 EE0>mov     dword ptr [esp+4], 3EE           ; |
00401843  |.  8B45 08       mov     eax, dword ptr [ebp+8]           ; |
00401846  |.  890424        mov     dword ptr [esp], eax             ; |
00401849  |.  E8 D2070000   call    <jmp.&USER32.GetDlgItemTextA>    ; \GetDlgItemTextA
0040184E  |.  83EC 10       sub     esp, 10                          ;  得到注册码的长度
00401851  |.  8D85 C8FDFFFF lea     eax, dword ptr [ebp-238]
00401857  |.  894424 04     mov     dword ptr [esp+4], eax
0040185B  |.  8D85 D8FEFFFF lea     eax, dword ptr [ebp-128]
00401861  |.  890424        mov     dword ptr [esp], eax
00401864  |.  E8 27FAFFFF   call    00401290     注册码计算
00401869  |.  8985 BCFDFFFF mov     dword ptr [ebp-244], eax         ; |
0040186F  |.  83BD BCFDFFFF>cmp     dword ptr [ebp-244], 0           ; |
00401876  |.  75 65         jnz     short 004018DD                   ; | 爆破修改这里就可以了
00401878  |.  C74424 0C 000>mov     dword ptr [esp+C], 0             ; |
00401880  |.  C74424 08 554>mov     dword ptr [esp+8], 00404055      ; |uuusucess!
00401888  |.  C74424 04 594>mov     dword ptr [esp+4], 00404059      ; |sucess!
00401890  |.  C70424 000000>mov     dword ptr [esp], 0               ; |
00401897  |.  E8 94070000   call    <jmp.&USER32.MessageBoxA>        ; \MessageBoxA
下面是注册码的计算过程
00401296  |> /8B45 08       /mov     eax, dword ptr [ebp+8]
00401299  |. |8B55 0C       |mov     edx, dword ptr [ebp+C]
0040129C  |. |0FB600        |movzx   eax, byte ptr [eax]
0040129F  |. |3A02          |cmp     al, byte ptr [edx]        关键 转变后的用户名与注册码做比较
004012A1  |. |75 1B         |jnz     short 004012BE
004012A3  |. |8B45 08       |mov     eax, dword ptr [ebp+8]
004012A6  |. |8038 00       |cmp     byte ptr [eax], 0      注册码没有到结束时,跳转
004012A9  |. |75 09         |jnz     short 004012B4
004012AB  |. |C745 FC 00000>|mov     dword ptr [ebp-4], 0
004012B2  |. |EB 1B         |jmp     short 004012CF
004012B4  |> |FF45 08       |inc     dword ptr [ebp+8]
004012B7  |. |8D45 0C       |lea     eax, dword ptr [ebp+C]
004012BA  |. |FF00          |inc     dword ptr [eax]
004012BC  |.^\EB D8         \jmp     short 00401296
比较明显的比较
所以就要符合  serial[i] = name[i]+5 就可以了
2009-11-20 15:44
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼上真不得了!分析的这么清楚,本来给新手玩的,引来一群大牛啊。
2009-11-20 15:55
0
雪    币: 388
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
好多初学者都没有一个明确的思路,只是提供一下思路而已
看到翻译小组成员过来,挺高兴
2009-11-20 16:15
0
游客
登录 | 注册 方可回帖
返回
//