[kctf]2019看雪CTF第一题-Q1

2019/3/15

看雪CTF第一题-流浪者

 

首先常规检查文件,EXEInfoPE以及PEID加上目测和尝试输入得到基础信息,32C++程序,无壳,验证类程序,有弹出窗口,存在中文字符串。

[kctf]2019看雪CTF第一题-Q1 第1张

[kctf]2019看雪CTF第一题-Q1 第2张

[kctf]2019看雪CTF第一题-Q1 第3张

既然无壳,首先采用IDA载入程序,首先进去的函数明显被处理过,隐藏了函数入口,利用前期信息,采用字符串作为跳板直接进入主函数。

搜索字符串快捷方式: shift+F12

[kctf]2019看雪CTF第一题-Q1 第4张

[kctf]2019看雪CTF第一题-Q1 第5张

[kctf]2019看雪CTF第一题-Q1 第6张

常规F5利用伪代码进行分析

[kctf]2019看雪CTF第一题-Q1 第7张

很明显,吸引我们目光的就是那三个嵌套调用的if,那么首先理解这一部分函数的意思,strlenstr),取str的长度,不为零就达成条件,这明显是输入不能为空,我们也可以看到else下是请输入pass!然后是一个for循环,这里的判断条件是str[i],而i是从零开始递加,那么str[i]的值什么时候为零呢,暂且放下,循环里面,嵌套着三个if4857659097122,这几个数字有什么意义?这几个数字非常特殊,因为ASCii码中刚好这6个数字闭合为三段,分别对应数字(48~57),小写字母(97~122),大写字母(65~90),那么刚刚好,当ASCii为零的时候,对应的就是\0,这个字符的意思就是字符串结束。

[kctf]2019看雪CTF第一题-Q1 第8张

也就是说,这一段在对我们的输入进行处理,分析绘图如下:

[kctf]2019看雪CTF第一题-Q1 第9张

现在我们并不知道为什么要将我们的输入转换成无意义的字符,我们分析完首先跟进去else的选项,当然就是图片中对应的end,返回的是失败。

[kctf]2019看雪CTF第一题-Q1 第10张

与之相对应,满足条件时提交的出现了正确的提示语。

[kctf]2019看雪CTF第一题-Q1 第11张

但是发现有一点不对,我们输入的是str类型,也可以说是char类型,现在却是int类型,仔细发现,调用函数的时候,使用了强制类型转换。

[kctf]2019看雪CTF第一题-Q1 第12张

那么,我们输入的字符对应变成了0~61在这个函数中又进行了处理,反正先看到了strcmp()函数对str1"KanXueCTF2019JustForhappy"进行对比,但是我们前面知道我们的输入变成了0~61,现在如何实现输入一串字符呢,返回上面查看while循环,发现str1的值是由这个函数一个一个的赋予的,那么aAbcdefghiabcde是个什么东西呀,良久之后,试着点击,震惊的发现,这tm是个数组,mmp你取这个名字要遭天遣的我跟你说,一目了然,这里面就是61个字符,也就是说,这形成了一个映射密码表。

[kctf]2019看雪CTF第一题-Q1 第13张

[kctf]2019看雪CTF第一题-Q1 第14张

这时,str1[v4]的意义也一目了然,为最后一位添加\0结束字符串,那么其中的(a1+4*v4)是什么东西成为了最后一道难题,我之前认为应当是我们的输入加上4倍的索引,成为一个移位加密,但是尝试之后吗,发现生成的注册码有问题,再次观察,发现,变量和数组索引是一样的,都是(a1+4*v4),同时,这个(a1+4*v4)也是在0~61之间的,那么是不是,这个(a1+4*v4)就是索引,编辑py脚本进行解密,成功得到flag

[kctf]2019看雪CTF第一题-Q1 第15张

[kctf]2019看雪CTF第一题-Q1 第16张

[kctf]2019看雪CTF第一题-Q1 第17张

最后,这次留下的疑问就是 *(_DWORD *)a1+4*v4)这个是什么意思,以及为什么原来是数组,进入验证函数却变成了int型,但是还是幸运的得到了flag

Python代码如下:

str1    = 'a b c d e f g h i A B C D E F G H I J K L M N j k l m n 0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x y z O P Q R S T U V W X Y Z'
str2    = '0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'
Key     = 'K a n X u e C T F 2 0 1 9 J u s t F o r h a p p y'
list1   = str1.split(" ")
list2   = str2.split(" ")
Key_l   = Key.split(" ")
PR_l    = []
for i in range(len(Key_l)):
   n       = str1.index(Key_l[i])
   PR_l.append(str2[n])
PR      = "".join(PR_l)
print(PR)

注:文章作者来自CatGames好友!