[DFS深度优先搜索][MoeCTF 2022]Art

1)ida打开后发现是简单的前后异或操作,但是无法直接反向异或出结果、直接使用暴力破解flag。但是由于题目存在多解,直接循环暴力破解会导致得到的不是想要的flag,因此要破解出所有满足条件的flag。

1)、直接只用广度优先搜索,会导致循环的层数过多,一共28层,顾放弃。、

2)、采用深度优先搜搜,则不用考虑循环层数过多的问题,每次试探一种情况,试探到头,后再试探下一个情况,直到将flag的每位每种字符(ASIIC码上)都试探到。

脚本如下:

观察试探的结果找到最可能的flag:

moectf{Art_i5_b14s7ing!!!!!}

深度优先搜索 :顾名思义,只要路能走即一直走到头,直到不能走在退回来试探别的路径

算法推荐 : 将求某个数的全排列 / 将 n 个卡片放入到 n 个盒子中,输出所有的放法。

#全排列举例 : n!

#深度优先搜索、递归的应用

def dfs(step):

    global table

    global book

    global count

    global n

    if step==n:              #盒子放完,输出后退回上一步

        print(table[1:n])

        count+=1

        return

    for i in range(1,n):

        if book[i] != 1:

            table[step]=i    #在第step放入卡片i

            book[i]=1        #卡片i已经放入盒子,置1

            dfs(step+1)      #放后一个盒子

            book[i]=0        #回退一部,取出卡片i

    return                   #第step步当前所有情况全部放完返回整个函数



n = int(input("please input your number:"))

count=0

table=[0 for i in range(n)]

book=[0 for i in range(n)]

dfs(1)

print(count)

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值