能力值:
( 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位里。
由于密码是有用户名直接生成的,所以,本题的用户名的生产算法,即为本题的解。
---------------------------------------------------------
科锐学子:沙金
|
能力值:
(RANK:350 )
|
-
-
3 楼
2008看雪论坛读书月第一题[7.9~7.13]
http://bbs.pediy.com/showthread.php?t=68174
准备评分,将此帖从答题区移出。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
这么快就搞定了...收藏...学习--先
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
天啊 前辈好快啊
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
收藏...学习--先
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
收藏,方便以后可以用
|
|
|