猜数字

这是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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值