xxd 与 hexdump
2026/5/29工具工具十六进制xxdhexdump大约 3 分钟
xxd 与 hexdump
是什么
xxd 和 hexdump 都是十六进制查看工具,用来观察文件的原始字节。
CTF Misc 中它们常用于:
- 查看文件头和文件尾
- 判断文件是否被拼接
- 查找隐藏字符串
- 修复损坏的魔数
- 分析二进制结构
安装与配置
Linux 常见环境通常自带。
如果缺少 xxd:
sudo apt install xxd如果缺少 hexdump:
sudo apt install bsdmainutils不同发行版包名可能不同,Kali/Ubuntu 一般可直接使用。
基本用法
查看文件前几行
xxd challenge.bin | head查看文件尾部
xxd challenge.bin | tail限制长度
xxd -l 64 challenge.bin从指定偏移开始
xxd -s 0x100 -l 128 challenge.binhexdump 查看
hexdump -C challenge.bin | head更多用法
只显示十六进制
xxd -p challenge.bin输出纯十六进制,无地址和 ASCII。
每行显示字节数
xxd -c 32 challenge.bin每行显示 32 字节。
显示小端序
xxd -e challenge.bin反向转换(hex to bin)
xxd -r -p hex.txt output.bin将十六进制文本转换回二进制文件。
hexdump 自定义格式
# 显示偏移、十六进制、ASCII
hexdump -C challenge.bin
# 只显示十六进制
hexdump -v -e '1/1 "%02x"' challenge.bin
# 每行 16 字节
hexdump -v -e '16/1 "%02x " "\n"' challenge.bin比较两个文件
diff <(xxd file1.bin) <(xxd file2.bin)从指定偏移显示到结尾
xxd -s 0x100 challenge.bin显示特定字节范围
xxd -s 0x100 -l 256 challenge.bin从偏移 0x100 开始显示 256 字节。
CTF常用技巧
判断文件头
xxd -l 16 file.bin常见魔数:
PNG: 89 50 4E 47 0D 0A 1A 0A
JPG: FF D8 FF
GIF: 47 49 46 38
ZIP: 50 4B 03 04
PDF: 25 50 44 46
ELF: 7F 45 4C 46
RAR: 52 61 72 21
7z: 37 7A BC AF
BMP: 42 4D
TIFF: 49 49 2A 00 (小端) 或 4D 4D 00 2A (大端)
PSD: 38 42 50 53查找 ZIP 头
xxd challenge.bin | grep "504b"如果图片尾部出现 50 4B 03 04,可能拼接了 ZIP。
提取偏移后的内容
假设 ZIP 从 0x1234 开始:
dd if=challenge.bin of=hidden.zip bs=1 skip=$((0x1234))修复文件头
谨慎操作,先复制文件:
cp broken.png fixed.png
printf '\x89\x50\x4e\x47\x0d\x0a\x1a\x0a' | dd of=fixed.png bs=1 seek=0 count=8 conv=notrunc查找文件尾标记
# PNG 文件尾
xxd challenge.bin | grep "4945 4e44"
# JPG 文件尾
xxd challenge.bin | grep "ffd9"分析文件结构
# 查看前 256 字节(通常包含文件头和关键结构)
xxd -l 256 challenge.bin
# 查看文件尾 256 字节
xxd -s -256 challenge.bin搜索特定字节序列
xxd challenge.bin | grep "deadbeef"
xxd challenge.bin | grep "flag"批量分析文件头
for f in *.bin; do
echo "=== $f ==="
xxd -l 16 "$f"
done使用脚本分析
#!/bin/bash
# 分析文件头和尾
FILE=$1
echo "=== File Header (first 32 bytes) ==="
xxd -l 32 "$FILE"
echo ""
echo "=== File Tail (last 32 bytes) ==="
xxd -s -32 "$FILE"
echo ""
echo "=== File Type ==="
file "$FILE"十六进制编辑
用 xxd 编辑
# 导出为十六进制文本
xxd challenge.bin > hex.txt
# 编辑 hex.txt
# 转换回二进制
xxd -r -p hex.txt modified.bin用 sed 修改单个字节
# 将偏移 0x00 处改为 0x89
printf '\x89' | dd of=file.bin bs=1 seek=0 count=1 conv=notrunc用 Python 修改
with open("file.bin", "r+b") as f:
f.seek(0)
f.write(b"\x89")常见问题
十六进制看不懂
先只关注文件头、文件尾、可见 ASCII、重复模式和明显分隔符。不要一开始试图读懂全部结构。
为什么 file 识别不出来
可能文件头被改,或者真实数据从后面某个偏移开始。用 xxd 找魔数。
修改字节有风险吗
有。修复前复制一份原文件,避免把原始证据改坏。
文件太大显示很慢
# 只看头部
xxd -l 256 large.bin
# 只看尾部
xxd -s -256 large.bin
# 使用 grep 搜索
xxd large.bin | grep "pattern"如何快速定位偏移
# 使用 grep 找到行号
xxd challenge.bin | grep -n "504b"
# 计算偏移
# 每行 16 字节,行号 * 16 = 偏移关联
- 文件头、文件尾与真实类型
- 图片像素与LSB
- 压缩包与嵌套文件
- file
- binwalk
- foremost