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 程序修改步骤
- 修改程序使比较错误字节时exit返回当前下标值
- 编写Python脚本接收退出值实现爆破
- 定位并修改汇编代码
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 程序修改要点
- 定位关键修改位置
- 处理空间不足问题(使用jmp跳转到空白区域编写代码)
- 修改后的程序逻辑
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
四、总结与扩展
-
爆破方法多样性:
- 除了上述两种方法,还可利用程序崩溃、时间延迟等作为判断依据
- 核心思路是让程序返回可判断flag正确位数的信息
-
适用场景:
- 单字节加密(如异或、加减等简单加密)
- 多字节组合加密(如双字节、四字节等)
- VM类题目中的加密操作
-
优化方向:
- 根据字符集缩小爆破范围
- 利用已知flag格式减少尝试次数
- 并行化处理提高爆破速度
-
防御措施:
- 作为出题者,可加入反爆破机制
- 增加时间延迟或随机因素
- 使用更复杂的加密方式组合