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

许可协议: CC BY-SA 4.0 。转载请注明出处,允许商用;改编/转载须以相同许可(CC BY-SA 4.0)发布。如有问题请联系我。