经过不断的努力,终于在127643S破解了第一题,中间既有坦途,也有曲折,分析求解过程如下。
0x01 分析环境
| 使用环境 | 备注 |
操作系统 | Windows xp | 简体中文版 |
虚拟机 | VMware Workstation | 版本号:12.1.1 build |
调试器 | Immunity Debugger | 版本号:V1.73 |
调试器 | IDA | 版本号:V6.5.140116 |
0x02 分析调试过程
用ImmunityDebugger打开WannaLOL2.exe,F9执行,经过几次试探输入,初步定位0x00401494处的CALL WannaLOL.00401096为调用验证序列号的主函数,在此按F2下断点。
再次运行,按F9运行到断点处,按F7单步进入00401096函数。在获取输入对话框内容的GetDlgItemTextA函数处下断点。再次运行,输入试探序列号后,程序执行到0x0040120B。
通过分析和调试得知,WannaLOL.00401300函数返回输入序列号的长度。
通过IDA静态分析,以下代码为确定序列号长度及特殊要求的关键代码:
.text:00401225 cmp eax, 4
.text:00401228 pop ecx
.text:00401229 jnz loc_4012CF
.text:0040122F push 30h
.text:00401231 pop ecx
.text:00401232 cmp [ebp-1Ch], cl
.text:00401235 jz loc_4012CF
.text:0040123B cmp [ebp-1Bh], cl
.text:0040123E jz loc_4012CF
.text:00401244 cmp [ebp-1Ah], cl
.text:00401247 jz loc_4012CF
.text:0040124D cmp [ebp-19h], cl
.text:00401250 jz short loc_4012CF
.text:00401252 cmp byte ptr [ebp-1Ch], 31h
.text:00401256 jnz short loc_4012CF
.text:00401258 cmp byte ptr [ebp-1Bh], 35h
.text:0040125C jnz short loc_4012CF
.text:0040125E jz short near ptr loc_401262+1
.text:00401260 jnz short near ptr loc_401262+1
通过调试和分析得知,序列号长度为4位,不能包含0,第一位必须为1,第二位必须为5,即15s(3)s(4)( s(n)为序列号第n位,s(3)!=0, s(4)!=0)。紧接下来的代码为浮点运算代码:
.text:00401267 xor ax, 7
.text:0040126B movsx eax, byte ptr [ebp-1Ah]
.text:0040126F sub eax, ecx
.text:00401271 mov [ebp-4], eax
.text:00401274 movsx eax, byte ptr [ebp-1Ch]
.text:00401278 fild dword ptr [ebp-4]
.text:0040127B sub eax, ecx
.text:0040127D mov [ebp-4], eax
.text:00401280 movsx eax, byte ptr [ebp-1Bh]
.text:00401284 fild dword ptr [ebp-4]
.text:00401287 sub eax, ecx
.text:00401289 mov [ebp-4], eax
.text:0040128C fidiv dword ptr [ebp-4]
.text:0040128F movsx eax, byte ptr [ebp-19h]
.text:00401293 sub eax, ecx
.text:00401295 mov [ebp-4], eax
.text:00401298 fsubp st(1), st
.text:0040129A fimul dword ptr [ebp-4]
.text:0040129D fmul ds:flt_40711C
.text:004012A3 fstp dword ptr [ebp-4]
.text:004012A6 jz short near ptr loc_4012AA+1
.text:004012A8 jnz short near ptr loc_4012AA+1
.text:004012AA call near ptr 48CB15h
.text:004012AF xor ax, 7
.text:004012B3 fld dword ptr [ebp-4]
.text:004012B6 fcomp ds:flt_407118
.text:004012BC push 0
.text:004012BE push offset aCrackme2017Ctf ;
.text:004012C3 fnstsw ax
.text:004012C5 sahf
.text:004012C6 jnz short loc_4012D6
.text:004012C8 push offset aRegistrationSu ;
.text:004012CD jmp short loc_4012DB
通过分析调试得出,浮点运算过程为序列号的第三位减去第一位和第二位的商,得到的减法结果再乘以第四位,最后再乘以DS:[0040711C]内存处的值0x41800000(十进制数字16的浮点表示法),以上乘法结果再与DS:[00407118]内存处的值0x43C00000(十进制数字384的浮点表示法)进行比较,如果相等则序列号正确,否则错误。
浮点运算过程
用数学公式表示为(s(3)-s(1)/s(2))*s(4)*16=384,即:
(s(3)-0.2)* s(4)=24
推算出:s(3)=5,s(4)=5,即序列号为1555
输入序列号1555,运行结果为:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课