首页
社区
课程
招聘
[原创]不问年少小学题crackme分析
发表于: 2009-2-24 14:38 8257

[原创]不问年少小学题crackme分析

2009-2-24 14:38
8257

首先找到消息处理函数处。就是下面

/*401EC0*/  PUSH EBP
/*401EC1*/  MOV EBP,ESP
/*401EC3*/  SUB ESP,4C
/*401EC6*/  PUSH EBX
/*401EC7*/  PUSH ESI
/*401EC8*/  PUSH EDI
/*401EC9*/  PUSH ECX
/*401ECA*/  LEA EDI,DWORD PTR SS:[EBP-4C]
/*401ECD*/  MOV ECX,13
/*401ED2*/  MOV EAX,CCCCCCCC
/*401ED7*/  REP STOS DWORD PTR ES:[EDI]
/*401ED9*/  POP ECX
/*401EDA*/  MOV DWORD PTR SS:[EBP-4],ECX
/*401EDD*/  MOV EAX,DWORD PTR SS:[EBP-4]
/*401EE0*/  ADD EAX,98
/*401EE5*/  MOV DWORD PTR SS:[EBP-8],EAX
/*401EE8*/  MOV ECX,DWORD PTR SS:[EBP-4]
/*401EEB*/  ADD ECX,5C
/*401EEE*/  MOV DWORD PTR SS:[EBP-C],ECX
/*401EF1*/  PUSH 0
/*401EF3*/  PUSH 0
/*401EF5*/  PUSH 0
/*401EF7*/  PUSH 0
/*401EF9*/  LEA EDX,DWORD PTR SS:[EBP-C]
/*401EFC*/  PUSH EDX
/*401EFD*/  PUSH math.00401023
/*401F02*/  CALL math.0047B275
/*401F07*/  PUSH 0
/*401F09*/  PUSH 0
/*401F0B*/  PUSH 0
/*401F0D*/  PUSH 0
/*401F0F*/  LEA EAX,DWORD PTR SS:[EBP-C]
/*401F12*/  PUSH EAX
/*401F13*/  PUSH math.00401091
/*401F18*/  CALL math.0047B275
/*401F1D*/  PUSH 0
/*401F1F*/  PUSH 0
/*401F21*/  PUSH 0
/*401F23*/  PUSH 0
/*401F25*/  LEA ECX,DWORD PTR SS:[EBP-C]
/*401F28*/  PUSH ECX
/*401F29*/  PUSH math.00401069
/*401F2E*/  CALL math.0047B275
/*401F33*/  PUSH 0
/*401F35*/  PUSH 0
/*401F37*/  PUSH 0
/*401F39*/  PUSH 0
/*401F3B*/  LEA EDX,DWORD PTR SS:[EBP-C]
/*401F3E*/  PUSH EDX
/*401F3F*/  PUSH math.00401046
/*401F44*/  CALL math.0047B275
/*401F49*/  PUSH 0
/*401F4B*/  PUSH 0
/*401F4D*/  PUSH 0
/*401F4F*/  PUSH 0
/*401F51*/  LEA EAX,DWORD PTR SS:[EBP-C]
/*401F54*/  PUSH EAX
/*401F55*/  PUSH math.00401037
/*401F5A*/  CALL math.0047B275
/*401F5F*/  PUSH 0
/*401F61*/  PUSH 0
/*401F63*/  PUSH 0
/*401F65*/  PUSH 0
/*401F67*/  LEA ECX,DWORD PTR SS:[EBP-C]
/*401F6A*/  PUSH ECX
/*401F6B*/  PUSH math.0040106E
/*401F70*/  CALL math.0047B275
/*401F75*/  PUSH 0
/*401F77*/  PUSH 0
/*401F79*/  PUSH 0
/*401F7B*/  PUSH 0
/*401F7D*/  PUSH 0
/*401F7F*/  PUSH math.0040100A
/*401F84*/  CALL math.0047B275
/*401F89*/  POP EDI
/*401F8A*/  POP ESI
/*401F8B*/  POP EBX

很明显是用多线程来检测的。

哇,7个线程,好多啊
我们一个个的看每个线程的作用

第一个:401023--->401fd0
作者可能用debug模式的静态库编译的 程序超大 里面代码很罗嗦 我就不复制了
第一个线程主要是检测
(用户名长度+注册码长度)mod (0xc)=0
那我们姑且先认为是(用户名长度+注册码长度)=12

接下来看第2个线程。

401091--->402080

这里是检测用户名必须是0-9中的数字

第3个线程

401069---->4021d0

这里是检测注册码必须是0-9中的数字

第4个线程
401046--->402320

到第四个线程便是算法部分了

我们不妨这样假设

user:x1x2
sn:y1y2

那么第四个线程所要求的是
x1 mod 3=0
y2 mod 7=0

y2-x1=2

可以再假设x1=3a   y2=7b

满足7b-3a=2即可 当然a,b为正整数

接下来看第5个线程:

401037--->4025e0

/*4026E1*/  MOV DWORD PTR SS:[EBP-50],EAX
/*4026E4*/  MOV EDX,DWORD PTR SS:[EBP-50]
/*4026E7*/  PUSH EDX
/*4026E8*/  CALL <math._atoi>
/*4026ED*/  ADD ESP,4
/*4026F0*/  MOV DWORD PTR SS:[EBP-28],EAX
/*4026F3*/  PUSH 0
/*4026F5*/  LEA ECX,DWORD PTR SS:[EBP-20]
/*4026F8*/  CALL math.00487C08
/*4026FD*/  MOV DWORD PTR SS:[EBP-54],EAX
/*402700*/  MOV EAX,DWORD PTR SS:[EBP-54]
/*402703*/  PUSH EAX
/*402704*/  CALL <math._atoi>
/*402709*/  ADD ESP,4
/*40270C*/  MOV DWORD PTR SS:[EBP-24],EAX
/*40270F*/  MOV ECX,DWORD PTR SS:[EBP-28]
/*402712*/  SUB ECX,DWORD PTR SS:[EBP-24]
/*402715*/  CMP ECX,-2
/*402718*/  JNZ SHORT math.00402741
/*40271A*/  MOV EAX,DWORD PTR SS:[EBP-28]
/*40271D*/  CDQ
/*40271E*/  MOV ECX,5
/*402723*/  IDIV ECX
/*402725*/  TEST EDX,EDX
/*402727*/  JNZ SHORT math.00402741
/*402729*/  MOV EAX,DWORD PTR SS:[EBP-24]
/*40272C*/  CDQ
/*40272D*/  MOV ECX,9
/*402732*/  IDIV ECX
/*402734*/  TEST EDX,EDX
/*402736*/  JNZ SHORT math.00402741
/*402738*/  MOV DWORD PTR SS:[EBP-58],1
/*40273F*/  JMP SHORT math.00402748
/*402741*/  MOV DWORD PTR SS:[EBP-58],0
/*402748*/  MOV EDX,DWORD PTR SS:[EBP-58]
/*40274B*/  MOV DWORD PTR DS:[5EB73C],EDX

这里需要满足的条件是:

x2 mod 5=0
y1 mod 9=0

y1-x2=2

可以再假设x2=5c   y2=9d

满足9d-5c=2即可。

下面看第6个线程。

40106e---->4028a0

/*4029BA*/  ADD ESP,4
/*4029BD*/  MOV DWORD PTR SS:[EBP-28],EAX
/*4029C0*/  MOV EDX,DWORD PTR SS:[EBP-24]
/*4029C3*/  SUB EDX,DWORD PTR SS:[EBP-28]
/*4029C6*/  CMP EDX,-1
/*4029C9*/  JNZ SHORT math.004029F2
/*4029CB*/  MOV EAX,DWORD PTR SS:[EBP-24]

这里需要满足x2-x1=1

也就是5c-3a=1

第7个线程是这里
/*402BEF*/  CMP ESI,ESP
/*402BF1*/  CALL <math.__chkesp>
/*402BF6*/  CMP DWORD PTR DS:[5EB74C],0
/*402BFD*/  JE SHORT math.00402C35
/*402BFF*/  CMP DWORD PTR DS:[5EB748],0
/*402C06*/  JE SHORT math.00402C35
/*402C08*/  CMP DWORD PTR DS:[5EB744],0
/*402C0F*/  JE SHORT math.00402C35
/*402C11*/  CMP DWORD PTR DS:[5EB740],0
/*402C18*/  JE SHORT math.00402C35
/*402C1A*/  CMP DWORD PTR DS:[5EB73C],0
/*402C21*/  JE SHORT math.00402C35
/*402C23*/  CMP DWORD PTR DS:[5EB738],0
/*402C2A*/  JE SHORT math.00402C35
/*402C2C*/  MOV DWORD PTR SS:[EBP-8],1
/*402C33*/  JMP SHORT math.00402C3C
/*402C35*/  MOV DWORD PTR SS:[EBP-8],0
/*402C3C*/  MOV EAX,DWORD PTR SS:[EBP-8]

显然是对比 前面6个线程是否都符合条件

符合的话就OK了。

根据前面的总结

也就是3个方程 4个未知数。

7b-3a=2
9d-5c=2
5c-3a=1

由以上方程求出a,b,c,d就行了  再分别代入前面的假设就可以求出x1,x2,y1,y2

我随便算了下面三组
a=53 b=23 c=32 d=18
a=158 b=68 c=95 d=53
a=263 b=113 c=158 d=88

x1=3a 159 474  789 y2=7b 161  476  791
x2=5c 160  475  790  y1=9d 162 477  792

第一组
159160
162161
第二组
474475
477476

第三组
789790
792791

现在有计算机了  不用手算了

我最笨的办法算的

int main(int argc, char* argv[])
{

int a,b,c,d;
for(a=0;a<300;a++){
        for(b=0;b<300;b++){
                for(c=0;c<300;c++){
                        for(d=0;d<300;d++){
                                if( (7*b-3*a==2)&&(9*d-5*c==2)&&(5*c-3*a==1) )
                                {
                 printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
                                }
                        }
                }
        }
}

        printf("Hello World!\n");
        return 0;
}


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

收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习printf("Hello World!\n");
2009-2-24 15:31
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
3
呵呵,嗯,不错啊,分析得很好,学习了!你能告诉我怎么找到OnOk这个按钮函数所对应的代码吗?谢谢
2009-2-24 15:51
0
雪    币: 295
活跃值: (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
基本上  发布程序 很少有你这样编译的

还debug模式的 还静态库编译   本来20K的东西  你这样弄都有2M了
2009-2-24 17:24
0
雪    币: 1137
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
向LZ学习了
2009-2-24 21:08
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
6
  还有一个问题向你请教,如何对每个线程函数进行单步调试,望楼主不吝赐教。
  已得解。
2009-2-25 08:07
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主很牛   X
2009-2-25 12:33
0
雪    币: 295
活跃值: (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
斑竹 为什么不给我个精华 鼓励鼓励我啊???
2009-3-2 22:38
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
9
  没办法,谁让你每次只给个结果,从不分析一下,也不讲下怎么找到关键点的?
2009-3-2 22:42
0
雪    币: 295
活跃值: (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
我分析这么详细. 关键点都在文章里啊

如果连怎么按F9  运行 怎么按F8慢慢走也写出来 那不是太罗嗦了吗?
2009-3-2 22:47
0
雪    币: 2316
活跃值: (129)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
11
学了不少,估计应该差不多了。有的细节再完善下吧,比如如何定位消息函数的。。。
2009-3-2 22:56
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
12
  呵呵,就是呀,每次把想要了解的东西都不讲,直接讲分析,一点意思都没有。
2009-3-2 23:00
0
雪    币: 297
活跃值: (21)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
13
希望看到方法
2009-3-3 20:56
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
14
005F8E44  恭喜你小学毕业了!!!.......打开保存为.所有文件 (

呵呵,又和sessiondiy 大侠偷学了一招高效的秘诀。
2009-3-7 20:46
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不是很懂啊  学习下
2009-5-3 15:42
0
雪    币: 210
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
膜拜中......
2009-5-5 19:45
0
游客
登录 | 注册 方可回帖
返回
//