ctf中的字节爆破
字数 852 2025-08-22 12:23:30

CTF中的字节爆破技术详解

一、字节爆破技术概述

字节爆破是CTF比赛中解决加密类题目的重要技术手段,主要针对单字节或多字节加密的情况。其核心思想是通过自动化方式逐个或成组尝试可能的字符组合,利用程序反馈信息判断当前字节是否正确。

二、方法一:利用exit返回下标

1. 基本原理

通过修改程序,使比较失败时exit返回当前比对成功的下标值,作为判断字节是否正确的依据。

2. 实战案例:吾杯CTF re的love题目

2.1 前期处理

  • 题目中存在需要解密的段
  • 通过函数调用前的栈操作反推需要异或的值

IDC脚本示例:

#include <idc.idc>
static main(){
    auto des = 0x176d;
    auto addr=0x155f;
    auto i;
    for(i = 0;addr+i!=des; ++i){
        PatchByte(addr+i,Byte(addr+i)^0x43);
    }
}

#include <idc.idc>
static main(){
    auto des = 0x155f;
    auto addr=0x12CB;
    auto i;
    for(i = 0;addr+i!=des; ++i){
        PatchByte(addr+i,Byte(addr+i)^0x44);
    }
}

2.2 题目分析

  • 检查flag开头是否为"wucup"
  • 采用单字节加密方式

2.3 程序修改步骤

  1. 修改程序使比较错误字节时exit返回当前下标值
  2. 编写Python脚本接收退出值实现爆破
  3. 定位并修改汇编代码

2.4 Python爆破脚本

import string
import itertools
import subprocess
import time
from paramiko.util import mod_inverse

alp = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!{}_"
input_data = "WuCup{aaaaaaaaaaaaaaaaaaaa}"
exe_file_path = r"/home/ubuntu/pycharm/cx/pythonProject/love"
star = ord('0') + 1
flag=0
ans = ''

for i in range(6,len(input_data)-1):
    for chars in itertools.product(alp, repeat=1):
        modified_data = (input_data[:i * 1] + ''.join(chars) + input_data[(i + 1) * 1:])
        process = subprocess.Popen(
            exe_file_path,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True
        )
        stdout, stderr = process.communicate(input=modified_data)
        print(process.returncode)
        print(modified_data)
        print(stdout)
        
        if process.returncode>flag:
            flag=process.returncode
            input_data=modified_data
            break
            
        if "Congratulations" in stdout:
            print(stdout)
            print(modified_data)
            exit(0)
            
print(input_data)

注意事项:

  • 该脚本需要在Ubuntu等Linux环境下运行

三、方法二:通过回显进行爆破

1. 基本原理

利用程序输出的回显信息判断当前字节是否正确。

2. 实战案例:BuildCTF的ezvm题目

2.1 题目特点

  • VM类题目,有op值指定对应操作
  • 动态调试发现连续执行两次操作,属于双字节加密

2.2 程序修改要点

  1. 定位关键修改位置
  2. 处理空间不足问题(使用jmp跳转到空白区域编写代码)
  3. 修改后的程序逻辑

2.3 Python爆破脚本

import string
import itertools
import subprocess
import time

alp = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!{}_"
input_data = "aaaaaaaaaaaaaaaaaaaaaaaa"
exe_file_path = r"D:\桌面\ez_vm\ez_vm\ez_vm.exe"
star = ord('A') + 2
ans = ''

for i in range(len(input_data)//2):
    for chars in itertools.product(alp, repeat=2):
        modified_data = (input_data[:i * 2] + ''.join(chars) + input_data[(i + 1) * 2:])
        process = subprocess.Popen(
            exe_file_path,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True
        )
        print(modified_data)
        stdout, stderr = process.communicate(input=modified_data)
        
        flag_prompt = "Please input your flag :"
        output_after_flag_prompt = stdout.split(flag_prompt, 1)[-1].strip() if flag_prompt in stdout else ""
        num = output_after_flag_prompt
        
        if num == chr(star):
            ans += ''.join(chars)
            input_data = modified_data
            print('[!]\t' + ans)
            star += 2
            break
        elif 'You did it! Flag is ' in num:
            ans += ''.join(chars)
            print('[!]\t' + ans)
            exit(0)
        else:
            continue

最终flag示例: vMp_1s_r0u9h_ORZ

四、总结与扩展

  1. 爆破方法多样性

    • 除了上述两种方法,还可利用程序崩溃、时间延迟等作为判断依据
    • 核心思路是让程序返回可判断flag正确位数的信息
  2. 适用场景

    • 单字节加密(如异或、加减等简单加密)
    • 多字节组合加密(如双字节、四字节等)
    • VM类题目中的加密操作
  3. 优化方向

    • 根据字符集缩小爆破范围
    • 利用已知flag格式减少尝试次数
    • 并行化处理提高爆破速度
  4. 防御措施

    • 作为出题者,可加入反爆破机制
    • 增加时间延迟或随机因素
    • 使用更复杂的加密方式组合
CTF中的字节爆破技术详解 一、字节爆破技术概述 字节爆破是CTF比赛中解决加密类题目的重要技术手段,主要针对单字节或多字节加密的情况。其核心思想是通过自动化方式逐个或成组尝试可能的字符组合,利用程序反馈信息判断当前字节是否正确。 二、方法一:利用exit返回下标 1. 基本原理 通过修改程序,使比较失败时exit返回当前比对成功的下标值,作为判断字节是否正确的依据。 2. 实战案例:吾杯CTF re的love题目 2.1 前期处理 题目中存在需要解密的段 通过函数调用前的栈操作反推需要异或的值 IDC脚本示例: 2.2 题目分析 检查flag开头是否为"wucup" 采用单字节加密方式 2.3 程序修改步骤 修改程序使比较错误字节时exit返回当前下标值 编写Python脚本接收退出值实现爆破 定位并修改汇编代码 2.4 Python爆破脚本 注意事项: 该脚本需要在Ubuntu等Linux环境下运行 三、方法二:通过回显进行爆破 1. 基本原理 利用程序输出的回显信息判断当前字节是否正确。 2. 实战案例:BuildCTF的ezvm题目 2.1 题目特点 VM类题目,有op值指定对应操作 动态调试发现连续执行两次操作,属于双字节加密 2.2 程序修改要点 定位关键修改位置 处理空间不足问题(使用jmp跳转到空白区域编写代码) 修改后的程序逻辑 2.3 Python爆破脚本 最终flag示例: vMp_1s_r0u9h_ORZ 四、总结与扩展 爆破方法多样性 : 除了上述两种方法,还可利用程序崩溃、时间延迟等作为判断依据 核心思路是让程序返回可判断flag正确位数的信息 适用场景 : 单字节加密(如异或、加减等简单加密) 多字节组合加密(如双字节、四字节等) VM类题目中的加密操作 优化方向 : 根据字符集缩小爆破范围 利用已知flag格式减少尝试次数 并行化处理提高爆破速度 防御措施 : 作为出题者,可加入反爆破机制 增加时间延迟或随机因素 使用更复杂的加密方式组合