这是2017第十届全国大学生信息安全竞赛的RE的第一道题,i春秋上有所有的Writeup,不过我还是自己做一下,记录一下。
一开始拿到题的时候没懂什么意思,于是偷偷看了一眼WriteUp,发现上面说是数独。。。虽然平时我也喜欢玩数独,但是数独的逆向还是第一次看到,脑子里第一个想的就是:还有这种操作?
放到IDA中,main函数F5一下:
看名字就可以发现好多都是Sudu,数独拼音。。。。
26行那个Sudu 是给整个二维数组初始化。
下面set_data:
也是往数组里面赋值,不过this那个数组里面是什么呢?
看一下:
把这些数放进数组以后显示如下:
所以set_data就是制作一个数独。
v15是输入,然后进行检查:set_sudu:
set_number:
其中a4是输入的数字,this是行号,a3是列号,数独题嘛,应该是输入9*9=91个数字,如果数字不等于0,就要判断 行号、列号、以及输入是否在1—9之间,如果不满足则result=0,就出错了。如果输入等于0,则不用判断。(一开始不懂,最后才知道原来就是:数独原来有数字的位置,输入就写0,所有不需要判断。)
如果全部都满足,返回1,1和1异或,等于0,不满足那个if语句,所以继续向下执行。
check函数:
看函数名应该就是 数独是否正确的检测,第一个:小矩形是否满足1-9,第二个检测列是否满足,第三个检测行是否满足。
三个函数意思都差不多,就是通过先设置v2为全1,然后设置v2[i]为0,i就是数独中的数字,如果9个数包含1-9,则v2里面应该是全0,这样就是对的了。
一开始很纠结为什么要乘以4,后来想起前面设置数独的时候,都是char类型的,就 一下明白了。
最后答案:
据说将原有的数字换成0,然后加上flag{}就是最后答案。
i春秋的链接也贴一下吧:i春秋WriteUp