首页
社区
课程
招聘
[原创]处女贴:一个超简单的CrackMe分析
发表于: 2013-9-30 10:12 12992

[原创]处女贴:一个超简单的CrackMe分析

2013-9-30 10:12
12992
处女贴,庆贺自己拿到鸡和马,发一个很简单的CrackMe分析,过程很简单,路过的大神勿喷!


stage1:简单的找出字符
stage2:根据输入的注册名和序列号进行相应的计算
stage3:移除一段字符的打印

利用IDA打开该exe后,第一步看到需要输入的字符长度为8
mov     dword ptr [esp], offset aEnterPasswordT ; "Enter Password To Continue : "
call    printf
lea     eax, [ebp+var_28]
mov     [esp+4], eax
mov     dword ptr [esp], offset aS ; "%s"
call    scanf
lea     eax, [ebp+var_28]
mov     [esp], eax      ; char *
call    strlen
cmp     eax, 8
jz      short Var_C_ZERO


接着对输入的字符的ascii码逐个地址1
.text:004013D0 AddOne:                                 ; CODE XREF: _main+164j
.text:004013D0                 cmp     [ebp+var_C], 7
.text:004013D4                 jg      short CallCmp
.text:004013D6                 lea     eax, [ebp+var_8]
.text:004013D9                 add     eax, [ebp+var_C]
.text:004013DC                 lea     edx, [eax-20h]
.text:004013DF                 lea     eax, [ebp+var_8]
.text:004013E2                 add     eax, [ebp+var_C]
.text:004013E5                 sub     eax, 20h
.text:004013E8                 movzx   eax, byte ptr [eax]
.text:004013EB                 inc     al
.text:004013ED                 mov     [edx], al
.text:004013EF                 lea     eax, [ebp+var_C]
.text:004013F2                 inc     dword ptr [eax]
.text:004013F4                 jmp     short AddOne

接着就是cmp了:
.text:004013F6 CallCmp:                                ; CODE XREF: _main+144j
.text:004013F6 lea     eax, [ebp+var_38]               ; 程序中要对比的原始字符串:QbTTx1sE
.text:004013F9 lea     edx, [ebp+var_28]               ; 输入的字符串ASCII加1后的结果
.text:004013FC mov     [esp+4], eax                    ; char *
.text:00401400 mov     [esp], edx                      ; char *
.text:00401403 call    strcmp
.text:00401408 test    eax, eax
.text:0040140A jnz     WrongAnswer


stage1算是完成了,接着进入stage2
stage2简单的来说就是先计算Name的长度,然后for循环逐个字符的ASCII码减1
.text:00401480 loc_401480:                             ; CODE XREF: _main+218j
.text:00401480 lea     eax, [ebp+var_48]
.text:00401483 mov     [esp], eax                      ; char *
.text:00401486 call    strlen
.text:0040148B cmp     [ebp+var_C], eax
.text:0040148E ja      short IsResolveStage2
.text:00401490 lea     eax, [ebp+var_8]
.text:00401493 add     eax, [ebp+var_C]
.text:00401496 sub     eax, 40h
.text:00401499 movsx   eax, byte ptr [eax]
.text:0040149C add     eax, [ebp+var_4C]
.text:0040149F dec     eax
.text:004014A0 mov     [ebp+var_4C], eax
.text:004014A3 lea     eax, [ebp+var_C]
.text:004014A6 inc     dword ptr [eax]
.text:004014A8 jmp     short loc_401480

简单用python写了个keygen:
#coding:gbk

import os

NAME = "XXX"

count = 0
for i in xrange(len(NAME)):
    count += ord(NAME[i])
count -= (len(NAME) + 1);
print count

好吧stage2完成了,接着是stage3,就是移除一串字符的printf,就是将如下的call进行填充
.text:004014E7                 mov     dword ptr [esp], offset aStage3Complete ; "\nStage 3 Completed if you don't see nag"...
.text:004014EE                 call    printf

这个在IDA中暂时不知道该如何填错nop,希望知道的指点一下,这个在od中简单解决了下。
好吧,这个CrackMe算是基本解决了
附上这个CrackMe CrackMe#1.7z

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 47147
活跃值: (20460)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
鼓励一下!
另外,这个 CrackMe下载地址提供一下。
2013-9-30 11:14
0
雪    币: 45
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
kanxue大大现身,好鸡冻,CrackMe已添加到附件中
2013-9-30 18:09
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持楼主啊!!!俺也是初学了,来学习啊
2013-12-4 10:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习了,支持楼主。
2014-1-1 20:40
0
雪    币: 159
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我都好几年了,一直处于初学水平。
2014-1-1 20:58
0
雪    币: 272
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
用IDA载入,代码段都找到了,就是不知道怎么写keygen。
2014-1-2 15:56
0
雪    币: 45
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
弄清楚key的计算方式,就能写keygen了
2014-1-3 16:52
0
雪    币: 90
活跃值: (92)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
这个crackme挺有意思的。
前面两个问题我解决了,写了一段注册代码:
#include <stdio.h>
#include <stdlib.h>

int main()
{
        char *stage1="PaSSw0rD";
        char name[10]={0};
        int serial=0;
        printf("stage1 password:%s\n",stage1);
        printf("stage2,please input your name(2<=char2<=10):");
        scanf("%s",name);
        printf("\n");
        char *p=name;
        while(*p)
        {
                serial+=(*p-1);
                p++;
        }
        serial--;
        printf("serial for your name:%d\n",serial);
        printf("thank you!\n");
        system("pause");
        return 0;
}
代码写的乱,请见谅。
第三个问题,我在od中用nop替换和填充了,下图这样就算完成了吗?
上传的附件:
2014-1-4 10:37
0
雪    币: 45
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
确实是主要的哈
[QUOTE=张jialin;1252530]这个crackme挺有意思的。
前面两个问题我解决了,写了一段注册代码:
#include <stdio.h>
#include <stdlib.h>

int main()
{
        char *stage1="PaSSw0rD";
        char name[10]={...[/QUOTE]
2014-1-4 14:21
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
IDA好像没有像OD一样提供assemble的功能。 我是转到Hex 视图中。 F2 edit . 手动输入 90 .再F2  commit change  这样麻烦就是复杂一点的指令根本记不住。。。不过nop还算搞得定。
2014-1-8 13:19
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习了 谢谢楼楼
2014-2-2 19:46
0
游客
登录 | 注册 方可回帖
返回
//