buuctf number_game

题目给了个64位ELF文件,直接用IDA64打开

 

 sub_4006D6要求输入必须为字符'0'~'4',很明显关键点在if语句中的四个函数里,先看最后的判定函数sub_400917

 

 分析循环可以看出,最后需要满足unk_601060指向的数据满足每行上的数互不相同,每列上的值也互不相同(将其按每行5个数据排列时)。所以猜测这是一个数独

将unk_601060中的数据排列之后就得到一张数独表

 

 然后需要知道填数独表的方式,跟进查看sub_400881函数,发现这个函数将unk_601060数据中的'#'依次替换位为v7中的字符,所以可以得到v7的值应该为"0421421430"

 

 然后就是v7的生成方式了,sub_400758和sub_400807两个函数让v7以二叉树遍历的方式遍历输入的v5

其中sub_400758函数将输入的v5按先序遍历的方式生成二叉树

 

 每个结点由长度为3的数组组成,v4[0]存放数据,v4[1]和v4[2]分别是每个结点的指向左孩子结点和右孩子结点的指针,用c语言实现这部分代码,可以得到v3的值为“0137849256”

 

 

 

 生成的二叉树大致如下,这里的数据表示的是输入的字符数组下标。

 

 sub_400807用中序遍历遍历这个二叉树,得到v7与v5的下标对应应该为

v7:7381940526

v5:0123456789

结合上面已经得出v7的值,就可以写一个简单的脚本得到v5的值

 

 得到最后的flag为

 

posted @ 2021-03-14 14:34  Th1r7een  阅读(69)  评论(0编辑  收藏  举报