CTF笔记
[学习笔记]攻防世界—reverse_re3
2025-03-19
•1 分钟•71 字分析
下载附件

直接用 IDA 打开,我们看看main函数

我们查看 sub_11B4 函数

看代码,先从寄存器取出64位的数据,然后定义了某个全局变量为0,之后返回现在这个数据与之前取出来的数据异或后的值,应该是关于反调试的函数
我们看看下一个函数

看代码,定义了一个520大小的数组,然后用memset对这个数组的512字节内容都初始化为0,用户输入的字符串是变量v4,我们按顺序来,先看看sub_86C函数

应该是把之前的一维数组以15x15也就是225作为一个界线,大家看做一个二维数组,判断这个位置的值是否等于3,我们看看 dword_202020 里面有什么

我们可以按 shift+e 将数据提取出来
这里设置格式要正确,因为dup前面的数字代表有几个后面的数字

我们再查看下面的代码,判断的100,115,119,27,97,我们转换一下看看是什么字符
a = [100,115,119,27,97]
for i in a:
print(chr(i))

其中,乱码的27经过查找,对应着传输结束

我们可以发现,这似乎是一个迷宫游戏,wsad是方向,我们看看他们的函数

其他几个函数也是类似的代码,判断是不是为1,是的话就将其更新为3,另一个判断是否等于4,等于4就返回一个长长整形
验证
提取迷宫
我们大概明白了,1是路,3是起点,4是终点,我们将提取出来的地图按照15x15打印出来,下面是代码
map = [1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,3,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,4,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,3,1,1,1,1,1,0,0,0,0,0,0,1,1,0,1,1,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,1,1,1,0,1,1,0,1,1,0,0,0,0,0,1,0,0,1,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,4,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0]
for m in range(3):
for i in range(15):
for n in range(15):
print(map[n+i*15+m*225],end="")
print()
print()
运行代码,我们成功跑出来三张图

计算flag
我们需要注意题目描述

不走回头路,所以我们可以直接写一条线到的路径
ddsssddddsssdss
dddddsssddddsssaassssddds
ddssddwddssssssdddssssdddss
三个合并在一起,进行 MD5 加密,得到结果
import hashlib
flag = hashlib.md5()
flag.update("ddsssddddsssdssdddddsssddddsssaassssdddsddssddwddssssssdddssssdddss".encode("utf-8"))
print(flag.hexdigest())

包上flag,提交,正确
总结
本题难度一般,我们只需要正确的跑出迷宫,即可得到flag