逆向查找_CTFer成长之路--一道数独逆向题目解题过程(算法分析、查找线索)...

本文介绍了CTF比赛中一道数独逆向题目,通过动态调试和静态分析,揭示了利用数独解题网站辅助解密的过程。主要涉及逆向工程、数独算法和内存中的小端模式理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4e8a1fdc9dc8e7d05e24070d80db0136.png

前言

CTF 是实战性很强的赛事。仅学习理论知识,不进行实操,永远无法成为 CTF 大神。本次博客为大家解读一道数独相关的逆向,讲解解题过程,总结知识点(CTF中的套路)。

题目介绍

本次选择的是出自2017年全国大学生信息安全竞赛的一道逆向题,题目分值200分,主要考察算法分析、脑洞、数独知识等内容。(为啥说考察数独知识呢,因为你在分析时如果想到了有可能是数独,你会解题飞快。)

准备工具

  1. OD反汇编工具,用于动态调试
  2. IDA反汇编工具,用于查看反汇编信息,静态分析
  3. ExeinfoPe 工具,可以查询软件信息
  4. 数独解题网站,https://shudu.gwalker.cn/

解题过程

  1. 运行软件

虚拟机中,直接运行程序,一顿猛输入,直接提示 fail!后程序退出。

91e9c6c473484949ac32ab675d13f081.gif

2. 使用 ExeinfoPe 查看软件信息

发现没有壳,开心一下。 是一个32位程序。

60e90cc000c796c262004a7c834b61d9.png

3. IDA查看软件信息

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

d17ee3ff945e339a8b8d675835bcfb35.png

4. 分析算法

在伪代码22行、23行发现有一个类,名叫 Sudu。 22行 初始化这个类。23行,Sudu::set_data,按名字理解是设置这个类的内部数据。具体设置什么数据还不知道。

如果要想得到 "success" 满足的 两个条件分别是 Sudo::check()函数要通过 , set_sudu()这个函数的返回值要为0。

6a281418a14c800b4812f8356f4cb722.png

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

631b08da346dea8e2fadaa25a2c75877.png

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

7b1fe1737fb2d62ed1e542afb30f6c77.png

从地址可以看到,所有数组使用了小端模式存储了。恢复数据后,是以下数独。

[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/

将上面数独输入进去。可以解出来。

2de4e4b13aab4f5576e3ab2dc336540f.png

6. 输入数独,获得flag

将网站解出来的数独,按顺序输入到命令行窗口。输入时,我们计算出来的填写数字。原先有数值的,用0替代。

输入值:340089102508406930016207058060875349709064820854392006093650071170023604602740590

flag 就是要输入的数组。

6aa8f8c3e8a4d5e118c6573de9003034.gif

主要知识点

1.小段模式和大段模式

什么是大端什么是小端? 数据 在内存中的表达方式有两种。以数据 0x12 34 56 78为例,

  1. 大端模式:Big-Endian

在本模式下,将高位字节排放在内存中的低地址段,低位字节安排在内存中的高地址端。

这种模式和我们的直观理解是一样的。

低地址 --------------------> 高地址 0x12 | 0x34 | 0x56 | 0x78

  1. 小端模式:Little-Endian

在本模式下,低位字节排放在内存中的低地址端,高位字节排放在内存中的高地址端。

低地址 --------------------> 高地址 0x78 | 0x56 | 0x34 | 0x12

在参考文献中对于大小端有个详细的描述,感兴趣的读者可以看一下。通常 arm、DSP大多采用小端模式。

写在结尾

这道是一个典型的技巧性比较强的题目。如果你的思维灵活或者敢于大胆猜测说不定能拿到第一滴血。

参考:

1.https://www.cnblogs.com/little-white/p/3236548.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值