
前言
CTF 是实战性很强的赛事。仅学习理论知识,不进行实操,永远无法成为 CTF 大神。本次博客为大家解读一道数独相关的逆向,讲解解题过程,总结知识点(CTF中的套路)。
题目介绍
本次选择的是出自2017年全国大学生信息安全竞赛的一道逆向题,题目分值200分,主要考察算法分析、脑洞、数独知识等内容。(为啥说考察数独知识呢,因为你在分析时如果想到了有可能是数独,你会解题飞快。)
准备工具
- OD反汇编工具,用于动态调试
- IDA反汇编工具,用于查看反汇编信息,静态分析
- ExeinfoPe 工具,可以查询软件信息
- 数独解题网站,https://shudu.gwalker.cn/
解题过程
- 运行软件
虚拟机中,直接运行程序,一顿猛输入,直接提示 fail!后程序退出。

2. 使用 ExeinfoPe 查看软件信息
发现没有壳,开心一下。 是一个32位程序。

3. IDA查看软件信息
直接拖入到 IDA中查看。在函数窗口看到main函数,直接点开后,按下 F5,伪代码如下:

4. 分析算法
在伪代码22行、23行发现有一个类,名叫 Sudu。 22行 初始化这个类。23行,Sudu::set_data,按名字理解是设置这个类的内部数据。具体设置什么数据还不知道。
如果要想得到 "success" 满足的 两个条件分别是 Sudo::check()函数要通过 , set_sudu()这个函数的返回值要为0。

点击进入 Sudu::set_data函数查看。从 第二个参数的地址,初始化一个9*9的数组。到这里如果能猜出是数独的是大神(逃跑)。

直接进入OD动态调试。发现初始化后的地址,数据如下:

从地址可以看到,所有数组使用了小端模式存储了。恢复数据后,是以下数独。
[0, 0, 7, 5, 0, 0, 0, 6, 0]
[0, 2, 0, 0, 1, 0, 0, 0, 7]
[9, 0, 0, 0, 3, 0, 4, 0, 0]
[2, 0, 1, 0, 0, 0, 0, 0, 0]
[0, 3, 0, 1, 0, 0, 0, 0, 5]
[0, 0, 0, 0, 0, 0, 7, 1, 0]
[4, 0, 0, 0, 0, 8, 2, 0, 0]
[0, 0, 5, 9, 0, 0, 0, 8, 0]
[0, 8, 0, 0, 0, 1, 0, 0, 3]
5. 直接用网站解题。
在线解数独的网站比较多,我们选了一个,https://shudu.gwalker.cn/
将上面数独输入进去。可以解出来。

6. 输入数独,获得flag
将网站解出来的数独,按顺序输入到命令行窗口。输入时,我们计算出来的填写数字。原先有数值的,用0替代。
输入值:340089102508406930016207058060875349709064820854392006093650071170023604602740590
flag 就是要输入的数组。

主要知识点
1.小段模式和大段模式
什么是大端什么是小端? 数据 在内存中的表达方式有两种。以数据 0x12 34 56 78为例,
- 大端模式:Big-Endian
在本模式下,将高位字节排放在内存中的低地址段,低位字节安排在内存中的高地址端。
这种模式和我们的直观理解是一样的。
低地址 --------------------> 高地址 0x12 | 0x34 | 0x56 | 0x78
- 小端模式:Little-Endian
在本模式下,低位字节排放在内存中的低地址端,高位字节排放在内存中的高地址端。
低地址 --------------------> 高地址 0x78 | 0x56 | 0x34 | 0x12
在参考文献中对于大小端有个详细的描述,感兴趣的读者可以看一下。通常 arm、DSP大多采用小端模式。
写在结尾
这道是一个典型的技巧性比较强的题目。如果你的思维灵活或者敢于大胆猜测说不定能拿到第一滴血。
参考:
1.https://www.cnblogs.com/little-white/p/3236548.html