You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ELF文件RSA签名验证异常求助:签名后验证始终返回NOT_OK

ELF签名工具验证环节始终返回NOT_OK问题排查

问题背景

我正在学习ELF文件与代码完整性相关知识,在Linux环境下用C语言实现了一个signtool工具(通过gcc+make编译),实现两个核心功能:

  • 签名功能:执行命令 ./signtool sign -e <可执行文件路径> -k <私钥路径>,使用OpenSSL生成的RSA私钥对ELF文件的.text段签名,并将签名写入新建的.signature段
  • 验证功能:执行命令 ./signtool verify -e <已签名文件路径> -k <公钥路径>,验证签名有效性,预期结果:
    • 验证成功输出 OK
    • 验证失败输出 NOT_OK
    • 文件未签名输出 NOT_SIGNED

目前签名功能看似正常,但无论目标文件完整性是否被篡改,验证环节始终返回NOT_OK,请求协助排查问题。

核心排查方向

1. 签名/验证时.text段数据一致性

  • 确认签名与验证阶段读取的.text段偏移量、大小完全一致:检查ELF段表解析逻辑,确保两次读取的是同一段的原始数据
  • 注意ELF字节序:x86架构为小端序,解析ELF头、段表项时需正确处理字节序转换,避免读取数据错位
  • 排查是否在签名时误包含了段表元数据,而验证时仅读取了纯代码数据

2. OpenSSL RSA参数匹配问题

  • 确保签名与验证使用相同的哈希算法:比如签名用RSA_sign(NID_sha256, ...),验证必须对应RSA_verify(NID_sha256, ...),哈希算法不匹配会直接导致验证失败
  • 检查公私钥配对:用openssl rsa -in private.key -pubout > public.key重新生成对应公钥,排除公钥不匹配问题
  • 验证签名数据完整性:签名长度应等于RSA密钥长度(如2048位密钥对应256字节),检查.signature段写入/读取的签名数据是否完整,无截断或额外填充

3. .signature段的ELF规范问题

  • 确认.signature段的创建符合ELF对齐规则:ELF段需要按指定对齐值填充,若写入时未处理对齐,可能导致签名数据被自动补零,验证时读取的签名与原始签名不一致
  • 检查验证时.signature段的解析逻辑:是否正确定位到该段,读取的偏移和长度是否与签名时写入的完全一致

4. 代码逻辑细节错误

  • 检查签名逻辑:RSA签名的是**.text段的哈希值**,而非原始代码数据,若直接对大段代码签名会导致验证失败
  • 检查验证逻辑:需先计算当前.text段的哈希值,再用公钥验证签名对应的哈希值是否匹配,而非直接验证原始数据
  • 启用OpenSSL错误日志:在代码中添加ERR_print_errors_fp(stderr),捕获RSA_sign/RSA_verify调用时的错误信息,定位具体失败原因

5. 测试场景验证

  • 确保测试使用的是签名后的ELF文件,而非原始未签名文件
  • 篡改测试时仅修改.text段内容,避免修改ELF头或其他段,防止段表解析错误导致验证失败

内容的提问来源于stack exchange,提问作者Misteltein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:39:55