-
-
[原创]CTF2017第一题WannaLOL、WannaLOL2
-
发表于: 2017-6-1 18:03 2677
-
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
得到两个结果:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!