re学习(17)Bugku-re-Tworld(使用DFS解决迷宫问题)

本文介绍了一个CTF挑战,涉及对加壳程序的分析,使用Python的ctypes库处理字节码解密,以及应用深度优先搜索(DFS)算法在给定的迷宫中寻找路径以获取密码。最终,通过解密过程和DFS搜索,找到的密码用于解锁隐藏的Word文档,其中包含最后的flag。
摘要由CSDN通过智能技术生成

下载地址:

跳转提示

参考视频:

【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中的第一个字符是大写,要修改成小写才可以成功

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值