mcpField
E
extract-elf

extract-elf

github.com/letta-ai开发15235 次安装4 周前更新
代码仓库

关于 extract-elf

用于从 ELF 二进制文件提取数据的技能,可解析文件头和 LOAD 段、将文件内容映射到虚拟地址并生成结构化输出,适用于需要谨慎处理 ELF 位数、字节序和数据类型的分析任务。

主要功能

  1. 01验证 ELF 标识、位数和字节序
  2. 02解析 ELF 文件头和程序头
  3. 03定位并提取 LOAD 段
  4. 04将段数据映射到虚拟地址
  5. 05核验输出范围和值

适用场景

  1. 01从 ELF LOAD 段提取数值
  2. 02按正确的字段宽度和字节序解读二进制数据
  3. 03根据文件内容检查提取的地址和值

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/letta-ai/skills --skill extract-elf

安装后在 Claude Code 中输入/extract-elf确认已加载。

详细介绍

ELF 二进制数据提取

本技能为从 ELF 二进制文件中提取数据的任务提供指导,包括读取头部、解析段,以及将二进制内容转换为结构化输出格式。

方法概述

ELF 提取任务通常需要:

  1. 解析 ELF 头部以了解文件结构
  2. 读取程序头以识别 LOAD 段
  3. 在正确的虚拟地址处提取数据
  4. 将二进制数据转换为所需的输出格式

实施步骤

步骤 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 字节

验证策略

宣布成功之前
  1. 验证输出格式:确保 JSON 格式正确,键的类型正确
  2. 检查地址范围:确认地址位于预期的段边界内
  3. 抽样验证值:使用十六进制检查工具,手动计算几个地址的预期值
手动验证命令

使用这些工具验证提取的值:

# 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. 对无符号数据使用有符号整数读取方式 - 对最高位为 1 的值会产生负数(例如,得到 -98693133,而不是 4196274163)

  2. 字节序处理错误 - 会产生完全错误的值;请根据 ELF 头部的字节 5 进行验证

  3. 段边界出现差一错误 - 仔细确认大小是包含边界还是不包含边界

  4. 假设按 4 字节对齐 - 检查段大小是否为读取大小的倍数;处理边界处的部分读取

  5. 混淆 32 位和 64 位字段的大小 - 始终检查 ELF 类别,并使用相应的字段大小

  6. 未经验证就过度自信 - 切勿假设“值是直接从二进制文件读取的,所以应该一致”——务必手动验证示例值

输出格式注意事项

生成结构化输出时(例如,JSON):

  • 如果地址需要作为 JSON 对象键,请使用字符串键(JSON 要求键为字符串)
  • 确保整数值处于 JavaScript/JSON 安全整数范围内(要保证完整精度,范围为 2^53 - 1)
  • 根据任务要求,考虑地址应使用十进制还是十六进制字符串表示

评论

支持 Markdown