后续持续跟进学习...
这段代码实现了一个基于神经网络权重矩阵的字符组合搜索算法,用于破解CTF(Capture The Flag)比赛中的flag。让我来详细解释它的工作原理:
核心功能概述
- 神经网络加载:从ZIP文件加载预训练的PyTorch模型(AliceNet1)
- 权重矩阵提取:获取全连接层的权重矩阵作为字符转移规则
- 字符映射表:定义允许的字符集及其编号映射
- 深度优先搜索(DFS):基于权重矩阵构建的规则,递归搜索可能的flag组合
- Flag验证与输出:当找到长度为16且以"}"结尾的字符串时,判定为正确flag
详细分析
1. 神经网络结构与加载
class AliceNet1(nn.Module):
pass
savepath='./0bdb74e42cdf4a42923ccf40d2a66313.zip'
net=torch.load(savepath)
mymat=net.state_dict()['fc.0.weight'].tolist()
- 定义了一个空的神经网络类AliceNet1
- 从ZIP文件加载预训练模型(实际结构可能包含全连接层"fc.0")
- 提取第一层全连接层的权重矩阵作为字符转移规则
2. 字符映射表
def char2num(ch):
tmpset = string.printable[0:36]+'*CTF{ALIZE}'
tmplen=len(tmpset)
for i in range(tmplen):
if(ch==tmpset[i]):
return i
flagset=string.printable[0:36]+'*CTF{ALIZE}'
- 允许的字符集包括:
- 前36个可打印字符(数字0-9,小写字母a-z)
- 特殊字符:*CTF{ALIZE}
- 字符到编号的映射用于索引权重矩阵
3. 深度优先搜索(DFS)
def dfs(ch,depth,ans):
ans+=ch
if(len(ans)==flaglen and ans[-1]=='}'):
print('flag is:',ans)
elif(len(ans)==flaglen):
return
else:
tmpi=char2num(ch)
for i in range(setlen):
if(flagset[i]==ch):
continue
tmpj=char2num(flagset[i])
if(mymat[tmpi][tmpj]==1.0 and used[tmpj]==False):
used[tmpj]=True
dfs(flagset[i],depth+1,ans)
used[tmpj]=False
- 递归搜索所有可能的字符组合
- 搜索条件:
- 当前字符到下一个字符的权重值为1.0
- 下一个字符未被使用过
- 终止条件:
- 组合长度达到16且最后一个字符是"}"(正确flag)
- 组合长度达到16但最后一个字符不是"}"(无效路径)
4. 搜索初始化
flaglen=10+6 # 最终flag长度为16
used=[False]*setlen
flag=''
used[char2num('*')]=True
dfs('*',0,flag)
- 从特殊字符"*"开始搜索
- 标记"*"为已使用
- 启动深度优先搜索
工作机制图解
权重矩阵(mymat) 字符映射表(flagset) ┌───────────────┐ ┌───────────────────────┐ │ │ │ 0:0, 1:1, ..., 36:*, │ │ 字符转移规则 │ │ 37:C, 38:T, ... │ │ │ └───────────────────────┘ └───────────────┘ │ ▼ 深度优先搜索(DFS) ┌───────────────────────────────────┐ │ 1. 从"*"开始 │ │ 2. 检查所有可能的下一个字符 │ │ - 权重值为1.0 │ │ - 未被使用 │ │ 3. 递归构建字符串 │ │ 4. 当长度=16且结尾为"}"时输出 │ └───────────────────────────────────┘
最终输出
flag is: *CTF{qx1jukznmr}
这个flag通过分析神经网络的权重矩阵,利用字符间的转移规则搜索得到。权重矩阵中的值(1.0)实际上定义了一个有向图,每个节点是一个字符,每条边表示允许的字符转移。
