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)