BUUCTF【36.密码学的心声】WriteUp

 一、题目基础信息

 平台:BUUCTF

 题型:Crypto(密码学)

 题目背景:二战间谍小故事,附件为一张简谱图片,需要从乐谱提取线索解密,按`flag{明文格式}`提交答案

 二、题目线索分析

阅读题目配图里的简谱配套歌词,能拿到两处关键解谜提示:

1. 文案`这里面没有八`:八进制合法数字范围是0~7,不会出现数字8,直接判定数字的进制为八进制;

2. 文案`请转成埃塞克码`:为谐音梗,指代ASCII编码,解密最终要把进制换算后的十进制数字映射成ASCII字符;

3. 补充排坑提示:`你肯定以为是十进制,其实简单的啦`,直接排除十进制解码思路,避免方向出错。

 三、数据提取

按照乐谱从上至下、每行从左往右的阅读顺序,依次提取每小节内的3位数字,整理得到八进制字符串数组:

["111","114","157","166","145","123","145","143","165","162","151","164","171","126","145","162","171","115","165","143","150"]

 四、编写Python解密脚本

 脚本代码

python

 存放从简谱提取的全部八进制字符串

oct_num_list = ["111","114","157","166","145","123","145","143","165","162","151","164","171","126","145","162","171","115","165","143","150"]

plaintext = ""

for oct_str in oct_num_list:

     参数8:把字符串按八进制规则转为十进制整数

    decimal_num = int(oct_str, 8)

     十进制ASCII编码值转为对应字符

    plaintext += chr(decimal_num)

 按题目要求封装flag格式

flag = f"flag{{{plaintext}}}"

print("解密明文:", plaintext)

print("最终Flag:", flag)

```

 代码逻辑讲解

1. `int(字符串,8)`:Python内置方法,完成八进制字符串→十进制整数的进制转换;

2. `chr(数字)`:依据ASCII编码表,把十进制数字转化成可读的文本字符;

3. 遍历拼接所有字符后,按平台规范套上`flag{}`格式完成封装。

 五、运行结果

脚本控制台输出内容:

解密明文: ILoveSecurityVeryMuch

最终Flag: flag{ILoveSecurityVeryMuch}

将`flag{ILoveSecurityVeryMuch}`提交靶机即可通过本题校验。

 六、知识点复盘&经验总结

 涉及知识点

1. 进制常识:八进制数字取值区间`07`,是本题判断进制的核心依据;

2. ASCII编码:计算机最通用的字符映射标准,可借助十进制编号查询对应字母、符号;

3. CTF线索破译:学会抓取谐音梗、文字暗示类谜题提示,锁定正确解密方向。

 做题心得

1. CTF文字类密码题不要盲目乱试各类加密算法,优先通读题干、配图的文案信息,文字一般会暗藏解题方向,能大幅减少无效试错;

2. 批量进制换算优先写Python脚本自动化处理,相比手动查表换算,既能规避人工抄写计算失误,也能提升解题效率。

 七、拓展小坑提醒

新手常见失误:直接以十进制数字调用`chr()`解码,会输出一堆乱码;本题歌词专门做了提示排雷,只要读懂文字线索就可以避开这个典型误区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值