好友
阅读权限10
听众
最后登录1970-1-1
|
160个crakeme系列--001
前言:上个帖子没有算法部分,在这补充,上个帖子地址:[url=适合新手的160个crakeme--001 https://www.52pojie.cn/thread-1283093-1-1.html (出处: 吾爱破解论坛)]适合新手的160个crakeme--001 https://www.52pojie.cn/thread-1283093-1-1.html (出处: 吾爱破解论坛)[/url]
之前说到有两个跳转会导致弹出错误框,我们看第一个跳转,观察附近call功能
mov eax,[43176c]
call 406930
看上去这个函数参数传入一个全局变量 [43176c]
我们跟随看看函数代码
看到 repne scas 这条命令可以知道这是一个计算字符串长度的函数
mov edx,edi
mov edi,eax
mov ecx,-1h
xor al,al
repne scas byte es:[edi] ;遍历edi指向的字符串,每次ecx-1,直到遇到al中的字符,这里为0,即字符串结尾符号
mov eax,-2h
sub eax,ecx ;因为之前计算的长度会算上结尾符号,所有这里用-2相减,即 -1 - (-1-(len+1)) -1 = -2 -(-2-len) = len
mov edi,edx
retn
我们f8运行这个函数
看到eax长度为1,可是我们输入的是‘123’,我们看看[43176c]指向的字符串是什么
可以看到[43176c]指向的字符串为 ascii码 10 对应的字符,长度为1
看上去不是计算我们输入的字符串的长度,我们输入 12345,678910,试试
看到eax为我们输入的用户名,可以确定此处限制了用户名的长度必须大于等于4
但为什么之前输入 123时计算的却是 另外一个字符串呢,我们往上看看是否有调用[43176c]这个全局变量的函数
看到这里将eax即用户名放入全局变量[43176c],此处 local.4 为ebp-10 ,local.4为od添加的标识,我们看运行下面的函数观察 全局变量[43176c]和ebp-10的变化
可以看出此处将用户名使用局部变量存储,全局变量改变了,我们研究的是序列号算法此处就不看了。
现在我们看下一个跳转
输入12345,6789跳过第一个call
不难看出此处正确的序列号已经生成为,“CW-4018-CRACKED”
该函数为比较序列号的函数我们输入 12345,“CW-4018-CRACKED”,看序列号是否正确
可以确定序列号就是“CW-4018-CRACKED”,说明序列号在之前就生成了,我们往上观察
看到熟悉的字符串,而且很多函数调用了局部变量,根据函数最后运行结果,这些局部变量存储了关键的字符串,
我们从0042fa79开始看,此处为第一个call跳转处且调用了局部变量
第一个call调用ebp-10,和一个整数值
eax返回5,ebp-10没有变化
可能也是一个计算长度的函数,继续往下看
0042FA87 |. 8B45 F0 mov eax,[local.4] ;将用户名存入eax
0042FA8A |. 0FB600 movzx eax,byte ptr ds:[eax] ;取第一个字符
0042FA8D |. F72D 50174300 imul dword ptr ds:[0x431750] ;[431750]为29h,将第一个字符乘以29h结果存入edx:eax
0042FA93 |. A3 50174300 mov dword ptr ds:[0x431750],eax ;
0042FA98 |. A1 50174300 mov eax,dword ptr ds:[0x431750] ; 因为edx为0,取结果放入[431750]
0042FA9D |. 0105 50174300 add dword ptr ds:[0x431750],eax ;结果*2 结果为 fb2即4018
接着向下看
可以看到403708传入ebp-4和字符串CW两个参数
运行后,ebp-4变为CW
403708应该是一个字符串赋值操作
接下来是将 CRACKED 赋值给ebp-8
接着是将 ebp-4(CW)和’-‘压栈
下面一个函数传入 ebp-18,以及 [431750],之前压栈的 ebp-4(CW)和’-‘未出栈,所以不是此函数的参数
运行后ebp-18变为“4018”此处应该是将整数转换成对应字符串
接着是三个压栈指令
并传入 ebp-c,5运行后出栈5个参数说明之前压栈的 ebp-4(CW)和’-‘未此函数的参数
运行后ebp-c存储着正确的序列号
紧接着是 41aa58函数 这个函数有点弄不懂,不过不影响
到此就到了第二个call指令处了 。
所以序列号算法为 ‘CW-’ + 用户名第一个 数*29*2+ ’-CRACKED‘
注册机 。。。。。省略
如果有错误或者建议,希望各位大佬指点。
闲话:荒废了好久,以后尽量每天花点时间来练习并发帖,希望今年能将这160系列弄完,emmm发现汇编好难学啊,看完16位又要看32,还要看64。emmm
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|