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
相关产品推荐
相关产品推荐

