-
-
[原创] 看雪CTF2018-第二题writeup
-
2018-6-20 11:56
2221
-
[原创] 看雪CTF2018-第二题writeup
拿到程序strings一下,发现提示:

根据提示以及题目知道是考察字典树(Trietree),字典树是一种用于快速检索字符串的数据结构。
IDA打开进入main函数,发现先调用checkformat函数校验输入,必须符合在A-Z a-z 0-9范围:

之后对输入的长度进行校验,需满足22个字节:
接着进入主要的校验函数check,在函数中首先对输入分割:
因为IDA中变量名排序和内存位置有关,因此可以整理出分割并乱序后的输入如下:
之后开始使用分割后的各个字符串插入字典树:
按照插入顺序应该是:
进入第二层check2函数,可以看到有两个校验,根据上面的插入过程,可以知道索引66和索引67分别对应的是该结点的分支数以及到达该结点的字符串出现的频率,a2是用于校验的另一个字典树,可以通过动态调试获得正确的值:
接着进入字符的比较:
取得的结点字符值与校验的字典树进入find函数中,这里动态调试可以获取正确的值(v2):
最后根据动态调试,画出正确的字典树如下:
由于对于相同长度的字符串,和插入字典树的次序无关(即不确定在输入中的位置),存在多解情况,因此进入第三层校验check3:
这里传入的参数是:
即输入需要满足如下的方程:
写脚本跑下:
得到可能的组合:
再对应字典树以及分支数和单词频率,得到最后的结果:
运行程序,成功:

flag:c7ctc7Mkxc7Mkctfct9c7M
看雪侠者千人榜,看看你上榜了吗?