首页
社区
课程
招聘
[原创]CTF2017第一题WannaLOL、WannaLOL2
2017-6-1 18:03 2124

[原创]CTF2017第一题WannaLOL、WannaLOL2

2017-6-1 18:03
2124

0、工具:OllyDbg v2.01

1、分析过程

(1)WannaLOL.exe

通过搜索字符串,然后稍向上翻,看到:

输入的字符串存入了eax中,接下来,0x00401220处,调用一个函数:

通过对该函数的分析,知道这个函数是求字符串长度,并将结果存入eax中,

然后判断字符串长度是否为4,如果不等于4,则会弹出error错误提示框。

然后判断4个字符中是否有'0',如果有,跳转到弹错误提示框处。

然后对输入的字符进行计算,判断等:

设输入的字符串为s,长度为4。

上图的判断过程伪码式子为:

( ( (float)(s[3]-0x30)-( (float)(s[1]-0x30) / (float)(s[2]-0x30) )  ) * (float)(s[4]-0x30) ) * 16.0

如果结果为384.0,则弹出成功的框。

用不是那么准确的Python穷举一下(xN表示每个字符与'0'的ASCII码差值):

from __future__ import division
for x1 in range(1,50):
    for x2 in range(1,50):
        for x3 in range(1,50):
            for x4 in range(1,50):
                if (x3-(x1/x2))*x4==24:
                    print x1,x2,x3,x4

结果很多:

以(1 1 4 8),(1 1 5 6)尝试:

(2)WannaLOL2.exe

由于是新手,还没看完1,2就出来了,还好作者没改多少,只是再求得长度为4,判断没有'0'后,多了这么几条指令,要求第一个字符必须为1,第二个字符必须为5,后面的算法一样。

还是上面的式子:

( ( (float)(s[3]-0x30)-( (float)(s[1]-0x30) / (float)(s[2]-0x30) )  ) * (float)(s[4]-0x30) ) * 16.0

其中( (float)(s[1]-0x30) / (float)(s[2]-0x30) )中s[1]='1', s[2]='5',该式结果0.2

上式简化为:

( ( (float)(s[3]-0x30)-0.2  ) * (float)(s[4]-0x30) ) * 16.0

如果结果为384.0,则弹出成功的框。

仍然用不那么准确的python:

from __future__ import division
for x3 in range(1,50):
     for x4 in range(1,50):
        if ((x3-(0.2))*x4)==24:
            print '1','5',x3,x4

得到两个结果:


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回