虎符CTF2022 handle - MISC

这篇博客介绍了参与2022数字中国创新大赛虎符网络安全赛道的经历,特别是关于一个名为handle的题目。作者利用之前某平台的类似题目创建字典,并通过迭代和剪枝策略减少尝试次数。经过统计和优化,最终通过随机选择和多次尝试成功解题。文章还分享了生成字典和交互脚本的代码,以及提高交互速度的技巧。

虎符CTF2022 | MISC | handle

(2022数字中国创新大赛虎符网络安全赛道)
Part of 【COMPASS CTF】 WriteUp
HED CTF HED战队 是 COMPASS 的战队之一
by Frankss@COMPASS

handle (二血 909pt)

思路

(隔壁某show平台上周刚做过某套神类似的题,于是很快就把字典搞出来了,但是交互写了很久丢掉了一血)
思路就是找一个有优势的固定词开头,然后根据返回结果分枝(枝),根据不同枝选择不同的尝试(剪枝),这样接下来要处理的重复量就少很多,重复这个过程两次,几乎每一个可能的词都有对应唯一序列(key)了。
简单统计一下生母韵母音调的频率,但是依据这个找出比较常见的词跑三轮之后会有400+个重复的路线,也就是这400+个词如果抽到大概率失败,算一下成功率pow(1-400/26000,512)是恐怖的万分之三,于是random choice字典里的词开始跑。

跑了十几分钟找到 露己扬才 只有一百多重复,成功率pow(1-100/26000,512)已经提升到了十分之一,决定多跑几次出flag。
P.S.因为成功之后就没有 > 输出了,所以边界条件炸了,在第512轮强制进交互赌第二轮出结果。

脚本

首先是生成字典的函数,kk是第一个固定的开头词,根据每次返回的文本更新键值对,然后对有多个结果的key迭代延长,每次选择第一个可能的结果,最后的重复个数即为有可能失败的词的数量:

# 其余内容和源代码完全一样,节省空间就不粘贴了
with open('idioms.txt', 'r', encoding='utf8') as f: # utf8
    idioms = [x.strip() for x in f.readlines()]

def check(guess, answer): # 魔改的check,改返回值为输出内容 方便到时候直接用服务器返回内容更新
    guesspy = get_pinyin(guess)
    answerpy = get_pinyin(answer)
    r = ""
    py_results = [check_part(guesspy[i], answerpy[i]) for i in range(3)]
    for i in range(4):
        for j in 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值