首页
论坛
课程
招聘
[原创] kxctf2018 第二题 数据结构
2018-6-19 23:04 1187

[原创] kxctf2018 第二题 数据结构

2018-6-19 23:04
1187
1. 先查看一下主函数,看下大体逻辑:

  通过动态调试很容易看到主函数里几个函数的功能,得到第一个信息输入的字符长度为22。仔细看check函数。
 2. 在check函数前面的局部变量初始化部分,有如下:
  
 经过动态调试可以发现,它会将输入的22位字符分割成8块来使用,块大小分别是(2,2,3,2,4,3,3,3),假设输入为:01234567890abcdefghijkl,栈中中布局如下图:
 上面是分的8块,下面是输入的原字符串。
 接下来是比较重要的一个构造函数,

 对v39进行初始化,经过分析可以知道一个node节点结构的构造,这是后面无意间发现的,其实启动动态调试后,查看String Views,可以看到

 题目为数据结构,所以应该着重看一些数据结构的构造函数之类,又看到这些字符串,Google搜索得知这是前缀树,思绪要向这边靠拢,猜测这个求解问题是前缀树的关键词查找,甚至前缀树的比较?
回到v39的构造函数,如下:

 其中v2就是一个node节点结构,然后通过调试可以知道v2+136后面跟着当前节点的子节点地址,v2+264值为node节点的子节点数,v2+268值用来标识当前节点作为关键字使用的次数。

后面一堆copy和sub_F22b40函数就是根据你输入的8个块来构建你的前缀树。

 重点是sub_F230E0,这个函数是把你的前缀树和预存的前缀树做比较,包含递归。

 通过分析 sub_F230E0 这些比较条件结合上面构建前缀树的函数sub_f22b40可以推断出上面node节点中各个数据的意义。
 到这里就可以直接按着node结构去分析预存树结构了,分析完了之后可以知道预存树结构为如下:

 得到预存树之后,就知道了解包含的字符串块是哪些:(kx,c7,c7M,c7M,c7Mk,ct,ct9,ctf),但是不知道顺序。
 分析过sub_f230f0可以知道它按你提供的8个关键字去查找预存树,而不是要求你关键字建立的前缀树和预存树一模一样,应该保证这8个关键字存在即可。大胆猜测这层验证与顺序无关,输入这8个关键字,重新调试,果然成果步过,进入最后一个函数sub_f21b80,里面有很简单的验证来保证输入的顺序:

 满足这个条件则会输出Answer correct!
 按照抑或条件,调整顺序得到最终字符串为:c7ctc7Mkxc7Mkctfct9c7M



[招聘] 欢迎你加入看雪团队!

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