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为