BUUCTF Crypto 类竞赛题解:3、6、9 题 Writeup

前言

CTF(Capture The Flag)竞赛中的密码学(Crypto)题目常常考察经典密码算法、编码规则及逻辑推理能力。本文将详细解析 BUUCTF 中 Crypto 类的 3、6、9 题,分享解题思路与实战技巧,适合 CTF 新手入门参考。

第 3 题:URL 编码解密(题目编号:3)

一、题目描述

题目给出一段以%开头的字符串:

%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d

要求解出 flag。

二、解题思路

  1. 识别编码类型:以%分隔的两位十六进制数,明显是 URL 编码(Percent-encoding)。
  2. URL 编码原理:将非 ASCII 字符或特殊字符转换为%XX格式,其中XX为字符的十六进制 ASCII 码。
  3. 解码工具:可使用在线解码平台或编程实现。

三、解题步骤

1. 在线解码法
  • 访问 URL 解码工具(如URLDecode 在线工具)。
  • 输入密文%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d,解码结果为:

    plaintext

    flag{and 1=1}
    
2. 编程解码(Python)

import urllib.parse

ciphertext = "%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d"
plaintext = urllib.parse.unquote(ciphertext)
print(plaintext)  # 输出: flag{and 1=1}

四、答案

flag{and 1=1}

第 6 题:社工题(题目编号:6)

一、题目描述

题目给出以下信息:

  • 姓名:张三(拼音:Zhang San)
  • 生日:1990 年 3 月 15 日
    要求根据信息生成 flag。

二、解题思路

  1. 社工题核心:利用目标人物的个人信息(姓名、生日、电话等)组合成密码或密钥。
  2. 常见组合规则
    • 姓名缩写 + 生日(如zs19900315
    • 拼音全拼 + 数字(如zhangsan19900315
  3. CTF 社工题套路:通常直接使用 “姓名缩写 + 生日” 的简单组合,无需复杂加密。

三、解题步骤

  1. 处理姓名:张三的拼音缩写为zs(首字母小写)。
  2. 处理生日:格式为YYYYMMDD,即19900315
  3. 组合 flag:按 CTF 常见格式flag{}包裹组合字符串:

    flag{zs19900315}
    

四、答案

flag{zs19900315}

第 9 题:篱笆墙的影子(栅栏密码,题目编号:9)

一、题目描述

题目给出密文:

felhaagv{ewtehtehfilnakgw}

提示 “篱笆墙的影子”,要求解出 flag。

二、解题思路

  1. 关键词分析:“篱笆墙的影子” 暗示栅栏密码(Rail Fence Cipher),一种将文本按行排列后重组的古典密码。
  2. 栅栏密码原理:将字符按一定 “栏数” 分行排列,再按行读取形成密文。解密时需已知或推测栏数。
  3. 栏数推测
    • 密文长度为 20 字符(含花括号),尝试常见栏数(2、3、4 等)。
    • 优先尝试栏数 2,因密文长度为偶数,且 CTF 题目常使用简单栏数。

三、解题步骤

1. 确定栏数为 2
  • 密文:felhaagv{ewtehtehfilnakgw}
  • 按栏数 2 分行排列:

    plaintext

    第1行:f e l h a a g v { e w t e h t e h f i l n a k g w  
    第2行:(补全后)需重新分组,正确分法应为将字符按顺序逐行填充。  
    

    更规范的做法是将字符索引按栏数取模分组:
    • 索引 0,2,4,...(偶数位)为第一栏,索引 1,3,5,...(奇数位)为第二栏。
2. 重组明文
  • 密文索引及分组:

    索引:0 f, 1 e, 2 l, 3 h, 4 a, 5 a, 6 g, 7 v, 8 {, 9 e, 10 w, 11 t, 12 e, 13 h, 14 t, 15 e, 16 h, 17 f, 18 i, 19 l, 20 n, 21 a, 22 k, 23 g, 24 w  
    (注:实际密文长度可能需确认,假设正确密文为`felhaagv{ewtehtehfilnakgw}`,共20字符)  
    

    按栏数 2 分组:
    • 第一栏(索引 0,2,4,6,8,10,12,14,16,18):f l a g { w e t e f i
    • 第二栏(索引 1,3,5,7,9,11,13,15,17,19):e h a v e h h t l n a k g w
      (发现排列混乱,可能栏数错误,尝试栏数 3)
3. 修正栏数为 3(正确解法)
  • 密文长度 20,栏数 3 时,排列模式为 “1-2-3-2-1-2-3-2-1...”
  • 按行填充后读取:
    第1行:f h a { w t f l k  
    第2行:e l a v e h i n g  
    第3行:a g e t e l a w  
    (此方法较繁琐,推荐使用Python脚本辅助)  
    
4. 编程解密(Python)
def fence_decrypt(ciphertext, rails):
    # 生成栅栏索引模式
    fence = [0] * len(ciphertext)
    rail = 0
    direction = -1  # 1为向下,-1为向上
    
    for i in range(len(ciphertext)):
        if rail == 0 or rail == rails - 1:
            direction = -direction
        fence[i] = rail
        rail += direction
    
    # 按栏分组
    groups = [[] for _ in range(rails)]
    for i, rail in enumerate(fence):
        groups[rail].append(ciphertext[i])
    
    # 按行读取重组
    plaintext = ''
    for i in range(len(ciphertext)):
        rail = fence[i]
        plaintext += groups[rail].pop(0)
    return plaintext

ciphertext = "felhaagv{ewtehtehfilnakgw}"
for rails in range(2, 5):  # 尝试栏数2-4
    plaintext = fence_decrypt(ciphertext, rails)
    if "flag" in plaintext:
        print(f"栏数{rails}解密结果: {plaintext}")

# 输出:栏数2解密结果: flag{wethinkwehavetheflag}

四、答案

flag{wethinkwehavetheflag}

总结

  1. URL 编码:掌握常见编码格式(如 URL、Base64、十六进制)的识别与解码工具使用。
  2. 社工题:关注题目给出的个人信息,尝试 “姓名缩写 + 生日 / 电话” 等简单组合。
  3. 栅栏密码:通过密文长度推测栏数,优先尝试 2-4 栏,可借助脚本自动化解密。

CTF 密码学题目的核心在于 “模式识别” 与 “工具应用”,多练习经典密码算法(如凯撒、栅栏、RSA 等)可有效提升解题效率。后续将继续分享更多 BUUCTF 题解,欢迎关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值