关于 extract-elf
用于从 ELF 二进制文件提取数据的技能,可解析文件头和 LOAD 段、将文件内容映射到虚拟地址并生成结构化输出,适用于需要谨慎处理 ELF 位数、字节序和数据类型的分析任务。
主要功能
- 01验证 ELF 标识、位数和字节序
- 02解析 ELF 文件头和程序头
- 03定位并提取 LOAD 段
- 04将段数据映射到虚拟地址
- 05核验输出范围和值
适用场景
- 01从 ELF LOAD 段提取数值
- 02按正确的字段宽度和字节序解读二进制数据
- 03根据文件内容检查提取的地址和值
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ letta-ai/ skills --skill extract-elf安装后在 Claude Code 中输入/extract-elf确认已加载。
详细介绍
ELF 二进制数据提取
本技能为从 ELF 二进制文件中提取数据的任务提供指导,包括读取头部、解析段,以及将二进制内容转换为结构化输出格式。
方法概述
ELF 提取任务通常需要:
- 解析 ELF 头部以了解文件结构
- 读取程序头以识别 LOAD 段
- 在正确的虚拟地址处提取数据
- 将二进制数据转换为所需的输出格式
实施步骤
步骤 1:验证 ELF 头部
处理文件之前,请验证该文件是否为有效的 ELF 二进制文件:
- 检查偏移量 0 处的魔数:
0x7F 'E' 'L' 'F'(十六进制:7f 45 4c 46) - 在偏移量 4 处识别 ELF 类别(32 位或 64 位)
- 在偏移量 5 处识别字节序(1 = 小端序,2 = 大端序)
步骤 2:解析 ELF 头部字段
根据 ELF 类别提取关键头部字段:
对于 32 位 ELF:
- 程序头偏移量:字节 28-31
- 程序头条目大小:字节 42-43
- 程序头数量:字节 44-45
对于 64 位 ELF:
- 程序头偏移量:字节 32-39
- 程序头条目大小:字节 54-55
- 程序头数量:字节 56-57
步骤 3:处理程序头
遍历程序头并识别 LOAD 段(类型 = 1):
- 提取虚拟地址(p_vaddr)
- 提取文件偏移量(p_offset)
- 提取文件大小(p_filesz)
- 提取内存大小(p_memsz)
步骤 4:提取段数据
对于每个 LOAD 段:
- 从文件的 p_offset 处读取数据
- 将数据映射到从 p_vaddr 开始的虚拟地址
- 按照指定要求处理对齐和填充
关键数据类型注意事项
有符号与无符号整数
这是二进制提取任务中最常见的错误来源。
读取二进制数据中的多字节整数值时:
- 内存地址始终为无符号数
- 大小字段始终为无符号数
- 除非任务明确要求按有符号数解释,否则数据值通常应按无符号数读取
常见 API 的区别:
- Node.js Buffer:
readUInt32LE与readInt32LE - Python struct:
'I'(无符号)与'i'(有符号) - C/C++:
uint32_t与int32_t
验证:如果输出包含负数,而预期输出仅显示正整数,则说明使用了错误的有符号性。
字节序
与 ELF 头部指定的字节序一致:
- 小端序(x86/x64 上最常见):使用
LE变体 - 大端序:使用
BE变体
整数大小
ELF 字段的大小因类别而异:
- 32 位 ELF:地址和偏移量为 4 字节
- 64 位 ELF:地址和偏移量为 8 字节
验证策略
宣布成功之前
- 验证输出格式:确保 JSON 格式正确,键的类型正确
- 检查地址范围:确认地址位于预期的段边界内
- 抽样验证值:使用十六进制检查工具,手动计算几个地址的预期值
手动验证命令
使用这些工具验证提取的值:
# View ELF header information
readelf -h <binary>
# View program headers (segments)
readelf -l <binary>
# Dump section contents in hex
objdump -s <binary>
# View raw hex bytes at specific offset
xxd -s <offset> -l <length> <binary>
# Calculate expected value from hex bytes (little-endian example)
# For bytes: 41 42 43 44 -> value = 0x44434241 = 1145258561
值的合理性检查
- 如果示例输出仅显示正整数,请确认输出中不含负值
- 将计算得到的几个值与手动十六进制计算结果进行比较
- 确认地址覆盖范围与预期段范围一致
常见陷阱
-
对无符号数据使用有符号整数读取方式 - 对最高位为 1 的值会产生负数(例如,得到 -98693133,而不是 4196274163)
-
字节序处理错误 - 会产生完全错误的值;请根据 ELF 头部的字节 5 进行验证
-
段边界出现差一错误 - 仔细确认大小是包含边界还是不包含边界
-
假设按 4 字节对齐 - 检查段大小是否为读取大小的倍数;处理边界处的部分读取
-
混淆 32 位和 64 位字段的大小 - 始终检查 ELF 类别,并使用相应的字段大小
-
未经验证就过度自信 - 切勿假设“值是直接从二进制文件读取的,所以应该一致”——务必手动验证示例值
输出格式注意事项
生成结构化输出时(例如,JSON):
- 如果地址需要作为 JSON 对象键,请使用字符串键(JSON 要求键为字符串)
- 确保整数值处于 JavaScript/JSON 安全整数范围内(要保证完整精度,范围为 2^53 - 1)
- 根据任务要求,考虑地址应使用十进制还是十六进制字符串表示
评论
支持 Markdown