下载地址:
参考视频:
【Bugku/CTF/Re/WP】使用DFS解决迷宫问题CTF "Tworld"_哔哩哔哩_bilibili
载入IDA后发现有UPX壳,先用工具进行脱壳,然后载入IDA进行分析。
编写脚本:
#全部代码
import struct #python内置模块
import ctypes #python内置模块
import numpy
key=[0xA3, 0x00, 0x00, 0x00, 0xA1, 0x00, 0x00, 0x00, 0x70, 0x00,
0x00, 0x00, 0xA6, 0x00, 0x00, 0x00, 0xF3, 0x00, 0x00, 0x00,
0xD7, 0x00, 0x00, 0x00]
enc_data=[
0xD0, 0x00, 0x00, 0x00, 0xCF, 0x00, 0x00, 0x00, 0x11, 0x00,
0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xA1, 0x00, 0x00, 0x00,
0xB1, 0x00, 0x00, 0x00
]
for i in range(0,len(enc_data),4):
k=ctypes.c_uint32(struct.unpack_from("<I",bytes(key),i)[0]).value
#’ctypes.c_uint32()‘ 是 ctypes 库中的一个函数,用于创建一个无符号的 32 位整数变量
#"<I" 是格式字符串,表示以小端字节序(<)解析一个无符号整数(I,即 32 位整数)。
# bytes(key) 是要解包的字节对象,
# i 是解包的起始位置。
d=ctypes.c_uint32(struct.unpack_from("<I",bytes(enc_data),i)[0]).value
print(chr(k^d),end='')
print()
maze=[
0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00,
0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00,
0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00,
0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
0x2E, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x2E, 0x00,
0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00,
0x2E, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x31, 0x00,
0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
0x2E, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x2E, 0x00,
0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00,
0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x2E, 0x00,
0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00,
0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00,
0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
0x2E, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00,
0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00,
0x2E, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x31, 0x00,
0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x2E, 0x00,
0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00,
0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
0x64, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x2E, 0x00,
0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00,
0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00,
0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00,
0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00,
0x00, 0x00, 0x31, 0x00, 0x00, 0x00
]
#输出:snaFRf
res=[]
for i in range(0,len(maze),4):
k=ctypes.c_uint32(struct.unpack_from("<I",bytes(maze),i)[0]).value
res.append(chr(k))
maze=numpy.array(numpy.array_split(res,7))
#将数组分割成7行
print(maze)
mark=numpy.zeros(maze.shape)
#使用 NumPy 库创建一个与 maze 形状相同的全零数组的语句。
stack=[]
direct=[
[0,-1],
[-1,0],
[0,1],
[1,0]
]
direct_str=['a','w','d','s']
def dfs_search(maze,x,y,x2,y2,step):
global stack,mark
if x==x2 and y==y2:
print('found the ways')
print(f"Step: {step} The way path: {''.join(stack)}")
return None
for i in range(len(direct)):
next_x=x+direct[i][0]
next_y=y+direct[i][1]
if next_x<0 or next_x>=len(maze) or next_y<0 or next_y>=len(maze[0]):
continue
if mark[next_x][next_y]==1 or maze[next_x][next_y] not in ['.','d']:
continue
mark[next_x][next_y]=1
stack.append(direct_str[i])
dfs_search(maze,next_x,next_y,x2,y2,step+1)
mark[next_x][next_y]=0
stack.pop()
dfs_search(maze,1,1,5,5,1)
#Your word password is:Qbf6q6x9^JdUrpkM
获得第一层密码~~~
但是打开后发现还需要密钥,通过maze(迷宫)找到密钥
注意:1.运行的时候用脱壳前的exe文件,否则运行不了
2.如果在本地cmd打开,即使输入正确,也会退出,无法查看;所以选择在pycharm的终端打开
用获得的第二个密钥,打开word文件,其中有flag
flag{Oh_my_God_this_one_is_so_trong}
注意:word中的第一个字符是大写,要修改成小写才可以成功