首页
社区
课程
招聘
[旧帖] [原创]一个Crakeme,搞了一晚上。终于搞定了 0.00雪花
2013-5-29 00:01 3488

[旧帖] [原创]一个Crakeme,搞了一晚上。终于搞定了 0.00雪花

2013-5-29 00:01
3488
我是小菜,不会传图片。首先找到,关键跳转,见
004011F3  ^\0F84 DEFEFFFF   je chap203.004010D7                
下面是程序

004011D9  ^\EB C1           jmp short chap203.0040119C                ; 返回跳转位置继续比较
004011DB    FF35 AF214000   push dword ptr ds:[4021AF]
004011E1    68 94214000     push chap203.00402194
004011E6    68 79214000     push chap203.00402179
004011EB    E8 54000000     call chap203.00401244
004011F0    83F8 01         cmp eax,1                                 ; 比较EAX,(标志位)
004011F3  ^ 0F84 DEFEFFFF   je chap203.004010D7                       ; 如果相等就注册成功
004011F9    EB 1F           jmp short chap203.0040121A                ; 不相等就 失败,跳转
004011FB    837D 10 01      cmp dword ptr ss:[ebp+10],1
004011FF  ^ 0F84 22FFFFFF   je chap203.00401127
00401205    837D 10 02      cmp dword ptr ss:[ebp+10],2
00401209    75 2F           jnz short chap203.0040123A
0040120B    E8 B4000000     call <jmp.&KERNEL32.ExitProcess>
00401210    B8 01000000     mov eax,1
00401215  ^ E9 FFFEFFFF     jmp chap203.00401119


然发现前面,还有一段,是判断 数字的长度。 应该是 大于1小于等于80040112F    FF75 08         push dword ptr ss:[ebp+8]
00401132    E8 41020000     call <jmp.&USER32.SendDlgItemMessageA>
00401137    A3 AF214000     mov dword ptr ds:[4021AF],eax
0040113C    83F8 00         cmp eax,0                                 ; 看数据长度是否大于0
0040113F    0F84 D5000000   je chap203.0040121A                       ; 数据长度小于0提示错误
00401145    83F8 08         cmp eax,8                                 ; 比较数据长度
00401148    0F8F CC000000   jg chap203.0040121A                       ; 数据长度大于8提示错误
0040114E    8BF0            mov esi,eax                               ; 存储数据长度1~8 位
00401150    6A 00           push 0
00401152    6A 00           push 0
00401154    6A 0E           push 0E
00401156    6A 04           push 4
00401158    FF75 08         push dword ptr ss:[ebp+8]
0040115B    E8 18020000     call <jmp.&USER32.SendDlgItemMessageA>
00401160    83F8 00         cmp eax,0
00401163    0F84 B1000000   je chap203.0040121A                       ; 如果数据长度等于0 提示错误
00401169    3BF0            cmp esi,eax                               ; 两个数据的长度要一致
0040116B    0F85 A9000000   jnz chap203.0040121A
00401171    68 60214000     push chap203.00402160
00401176    6A 08           push 8
00401178    6A 0D           push 0D

关键的密码生成部分。也是找了半个小时,没办法,小菜一枚。
0040119C    41              inc ecx                                   ; ecx 加1,当ECX=9,的时候  eax 返回的是0
0040119D    0FBE81 60214000 movsx eax,byte ptr ds:[ecx+402160]        ; 402160+偏移0 给 EAX
004011A4    83F8 00         cmp eax,0
004011A7    74 32           je short chap203.004011DB
004011A9    BE FFFFFFFF     mov esi,-1
004011AE    83F8 41         cmp eax,41                                ; 和0x41比较 就是 ‘A’
004011B1 >  7C 67           jl short chap203.0040121A                 ; 小于‘A’,就失败
004011B3    83F8 7A         cmp eax,7A                                ; 就是‘z’
004011B6    77 62           ja short chap203.0040121A                 ; 大于z,就失败
004011B8    83F8 5A         cmp eax,5A                                ; 就是‘Z’
004011BB    7C 03           jl short chap203.004011C0                 ; 小于‘Z’,就进去查表
004011BD    83E8 20         sub eax,20                                ; eax减去32;//隐含的小写字母转大写“”
004011C0    46              inc esi                                   ; 查表中下一个数字
004011C1    0FBE96 17204000 movsx edx,byte ptr ds:[esi+402017]        ; 隐含了“ASCII码大于Z直接查表,和小于Z的,减掉32,来查表”
004011C8    3BC2            cmp eax,edx                               ; 比较第二位
004011CA  ^ 75 F4           jnz short chap203.004011C0                ; 不相等就向后比较
004011CC    0FBE86 3C204000 movsx eax,byte ptr ds:[esi+40203C]        ; 查表
004011D3    8981 94214000   mov dword ptr ds:[ecx+402194],eax         ; 生成加密后的数据
004011D9  ^ EB C1           jmp short chap203.0040119C                ; 返回跳转位置,继续比较
004011DB    FF35 AF214000   push dword ptr ds:[4021AF]
004011E1    68 94214000     push chap203.00402194

继续寻找,发现还有一个核对的部分。将序列号,和生成的 密码对比。
00401244    C8 000000       enter 0,0                                 ; 进入函数
00401248    B8 01000000     mov eax,1                                 ; EAX=1,作为标记使用
0040124D    8B7D 08         mov edi,dword ptr ss:[ebp+8]              ; 存入CODE
00401250    8B75 0C         mov esi,dword ptr ss:[ebp+C]              ; 加密后的数据
00401253    8B4D 10         mov ecx,dword ptr ss:[ebp+10]             ; 下一句 REPE的长度,8个数据
00401256    F3:A6           repe cmps byte ptr es:[edi],byte ptr ds:[>; 比较 加密后的数据 和user name  是否相等
00401258    67:E3 05        jcxz short chap203.00401260               ; 不等就离开
0040125B    B8 00000000     mov eax,0                                 ; 给EAX =0
00401260    C9              leave
00401261    C2 0C00         retn 0C                                   ; 对比成功时,EAX=1;

。如果想强力爆破,可以直接修改EAX的值,后面判断会用到。
这里就是最后了,比较EAX ,进行核对。
004011F0    83F8 01         cmp eax,1                                 ; 比较EAX,(标志位)
004011F3  ^ 0F84 DEFEFFFF   je chap203.004010D7                       ; 如果相等就注册成功
。到这里,这个Crakeme,  就结束了。本想写个注册机,如果写了,稍候传上。
附上里面的两个码表:
//402017
00402017  41 31 4C 53 4B 32 44 4A 46 34 48 47 50 33 51 57  A1LSK2DJF4HGP3QW
00402027  4F 35 45 49 52 36 55 54 59 5A 38 4D 58 4E 37 43  O5EIR6UTYZ8MXN7C
00402037  42 56 39 00 20 53 55 37 43 53 4A 4B 46 30 39 4E  BV9. SU7CSJKF09N
00402047  43 53 44 4F 39 53 44 46 30 39 53 44 52 4C 56 4B  CSDO9SDF09SDRLVK
00402057  37 38 30 39 53 34 4E 46 00                       7809S4NF.

码表2:
//40203c
0040203C  53 55 37 43 53 4A 4B 46 30 39 4E 43 53 44 4F 39  SU7CSJKF09NCSDO9
0040204C  53 44 46 30 39 53 44 52 4C 56 4B 37 38 30 39 53  SDF09SDRLVK7809S
0040205C  34 4E 46 00                                      4NF.

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

上传的附件:
收藏
点赞3
打赏
分享
最新回复 (6)
雪    币: 18
活跃值: (71)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
zhjmyx 1 2013-5-29 02:03
2
0
终于算出了注册机。例如 输入 8个小a,密码就是8个大S。这个机还不是很完善。好久没VC++6,都有点手生了。
注册机原码如下, 测试 数据  8个小a,密码就是8个大S,测试通过。
#include"stdio.h"
#include"string.h"
void main(void){

        char tabel0[]="A1LSK2DJF4HGP3QWO5EIR6UTYZ8MXN7CBV9. SU7CSJKF09NCSDO9SDF09SDRLVK7809S4NF.";//解码表
        char tabel1[]="SU7CSJKF09NCSDO9SDF09SDRLVK7809S4NF"; //输出表
        char tableTmp[10];       
        char outPut[10];
int index=0; int show=0;
        while(1){       
               
                scanf("%s",&tableTmp);
                for(show=0;show<=7;show++){

                        for(index=0;index<140;index++){               
                                if( (tableTmp[show]-0x20)==tabel0[index]){

                                                        outPut[show]=tabel1[index];
                                                //        break;
                                }
                        }
                }
        //        for(index=0;index<=7;index++){
        //       
        //        printf("%c",*(outPut+index));
        //        }
puts(outPut);

       
        }

}
上传的附件:
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
loongzyd 10 2013-5-29 08:07
3
0
谢谢楼主分享,加油!
雪    币: 18
活跃值: (71)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
zhjmyx 1 2013-5-29 08:14
4
0
谢谢鼓励,我会继续努力的。 转正时,心情很激动啊
雪    币: 18
活跃值: (71)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
zhjmyx 1 2013-5-29 08:39
5
0
趁着还有点时间,就发一篇帖子,只不过自娱自乐。还是那句老话,看下面
这次的主题是 :VC6 。0————编译出EXE---ollydbg反编译出asm
crakeme :
源代码如下
:得到520,就回复我爱你。#include"stdio.h"
void main(){
int t=1;
printf("input numbeer\n");
        while(1){

                if(scanf("%d",&t)){
                        if(t==520)
                                printf("i love U\n");
                        else
                                printf("number err\n");
                }
                else{
                printf("must input numbeer\n");
                break;
                }

        }
}
od:汇编
0040DA09    68 EC2F4200     push 强大的反.00422FEC                       ; %d
0040DA0E    E8 FD36FFFF     call 强大的反.00401110
0040DA13    83C4 08         add esp,0x8
0040DA16    85C0            test eax,eax                             ; 比较EAX
0040DA18    74 27           je short 强大的反.0040DA41                   ; 相等就跳 到40DA41
0040DA1A    817D FC 0802000>cmp dword ptr ss:[ebp-0x4],0x208         ; 比较堆栈中的数据和0x208(520)
0040DA21    75 0F           jnz short 强大的反.0040DA32                  ; 不相等就跳到40DA32,相等就往下走
0040DA23    68 D82F4200     push 强大的反.00422FD8                       ; i love U\n
0040DA28    E8 6336FFFF     call 强大的反.00401090
0040DA2D    83C4 04         add esp,0x4
0040DA30    EB 0D           jmp short 强大的反.0040DA3F
0040DA32    68 1C204200     push 强大的反.0042201C                       ; number err\n
0040DA37    E8 5436FFFF     call 强大的反.00401090
0040DA3C    83C4 04         add esp,0x4
0040DA3F    EB 0F           jmp short 强大的反.0040DA50
0040DA41    68 FC2F4200     push 强大的反.00422FFC                       ; must input numbeer\n
0040DA46    E8 4536FFFF     call 强大的反.00401090

因为这次把一个vc中的条件判断,反汇编,所以没有注册机。
如果想要程序一直输出 i love u.,修改
0040DA21   /75 0F           jnz short 强大的反.0040DA32                  ; 不相等就跳到40DA32,相等就往下走

。可以将 jnz,汇编换成JE,就可以了。
这是新手贴:附上注释如下
JNZ:如果不相等就跳转
JE:相等就跳转
crakeme:
上传的附件:
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Michiko 2013-5-29 08:49
6
0
不错啊 多谢楼主分享
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
大小人物 2013-5-29 09:12
7
0
楼主写的不错 学习了
游客
登录 | 注册 方可回帖
返回