看雪论坛
发新帖
1

[原创][原创]看雪CTF2017第一题分析

dolphindiv 2017-6-4 21:05 1740

    经过不断的努力,终于在127643S破解了第一题,中间既有坦途,也有曲折,分析求解过程如下。

    0x01  分析环境  

    

 

使用环境

备注

操作系统

Windows xp

简体中文版

虚拟机

VMware Workstation

版本号:12.1.1 build

调试器

Immunity Debugger

版本号:V1.73

调试器             

IDA

版本号:V6.5.140116


0x02 分析调试过程

ImmunityDebugger打开WannaLOL2.exeF9执行,经过几次试探输入,初步定位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)=5s(4)=5,即序列号为1555

输入序列号1555,运行结果为:





本主题帖已收到 1 次赞赏,累计¥1.00
最新回复 (3)
1
dolphindiv 2017-6-6 12:54
2
感谢打赏
yber 2017-6-11 17:48
3
很详细
Baymax 2017-8-30 16:12
4

1

返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 域名 加速乐 保护 | SSL证书 又拍云 提供 | 微信公众号:ikanxue
Time: 0.013, SQL: 10 / 京ICP备10040895号-17