首页
社区
课程
招聘
[看雪读书月]2008看雪论坛读书月第一题
发表于: 2008-7-10 16:14 8769

[看雪读书月]2008看雪论坛读书月第一题

2008-7-10 16:14
8769
收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 136
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
2
分析过程

OD忽略异常并隐藏进程,可直接调试。

bp MessageBoxA
随便输入用户名和密码点确定后断下。

在 00401CC0  下段 重新输入 用户名,密码
程序对 用户名长度长度进行判断,并判断 每一位是否在 'a'-'z' 之间

00401BB0 > $  55            push    ebp 进行密码的第一次验证
分析得知,用户名长度为6位 密码长度为0xC位。
密码的1、3、5、7、9、11 为分别对应用户名的每一位,结果为 用户名每一位-0x1B
密码的2、4、6、8、10、12 位大于用户名每一位-0x20

00401C84   .  C745 E0 9C020>mov     dword ptr [ebp-20], 29C
00401C8B   .  8B4D E0       mov     ecx, dword ptr [ebp-20]
00401C8E   .  C601 06       mov     byte ptr [ecx], 6
00401C91   .  EB 0B         jmp     short 00401C9E

这里对29C地址有写操作,会发生异常,异常返回 [ebp-14] 里所指向的地址。当密码满足第一次验证条件时,返回到004017F0 否则返回到004017B0
4017B0 弹出错误对话框后退出程序。

跟入004017F0 后分析,通过用户名的第1位和第6位生成一个“密钥”(暂时叫密钥)。
跟到

004018BB   > \6A 00         push    0                                         
004018BD   .  68 60354000   push    00403560      
004018C2   .  68 54354000   push    00403554     
004018C7   .  0FBE0D F64040>movsx   ecx, byte ptr [4040F6]   
004018CE   .  83E9 55       sub     ecx, 55      
004018D1   .  F7D9          neg     ecx            
004018D3   .  1BC9          sbb     ecx, ecx   
004018D5   .  41            inc     ecx     
004018D6   .  51            push    ecx   
004018D7   .  FF15 00324000 call    dword ptr [<&USER32.MessageBoxA>]   
004018DD   .  8945 D8       mov     dword ptr [ebp-28], eax
004018E0   .  837D D8 00    cmp     dword ptr [ebp-28], 0
004018E4   .  74 15         je      short 004018FB

后碰到的难题。一度怀疑是否分析错了。
仔细分析前面的代码,没有找到原因。仔细分析代码后发现
004018C7   .  0FBE0D F64040>movsx   ecx, byte ptr [4040F6]   
004018CE   .  83E9 55       sub     ecx, 55      
004018D1   .  F7D9          neg     ecx            
004018D3   .  1BC9          sbb     ecx, ecx   
004018D5   .  41            inc     ecx     

[4040F6]为密码的11位,而这位密码是用户名的第6位-0x1B
当用户名第6位是'p'时,ecx = 1 否则 ecx = 0

ecx做为 MessageBoxA 函数的句柄参数。当ecx=1时,MessageBoxA函数无法正确弹出对话框,返回值为0
由此判断 用户名的第6位置能为'p'

下面就简单很多了,判断密码的第1、3、5、7、9、11位是否在 前面生成的 “密钥”指定位数开始连续5位里。

由于密码是有用户名直接生成的,所以,本题的用户名的生产算法,即为本题的解。

---------------------------------------------------------
科锐学子:沙金
2008-7-10 18:12
0
雪    币: 47147
活跃值: (20465)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
2008看雪论坛读书月第一题[7.9~7.13]
http://bbs.pediy.com/showthread.php?t=68174

准备评分,将此帖从答题区移出。
2008-7-23 21:18
0
雪    币: 183
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这么快就搞定了...收藏...学习--先
2008-7-26 01:53
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
天啊 前辈好快啊
2008-7-31 09:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
收藏...学习--先
2008-8-3 00:15
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
收藏,方便以后可以用
2009-7-30 00:03
0
游客
登录 | 注册 方可回帖
返回
//