【问题标题】:Verify signature of PE file验证 PE 文件的签名
【发布时间】:2021-11-15 23:56:01
【问题描述】:

我正在尝试使用 OpenSSL(或者实际上使用 Python,但似乎 Python 在证书处理方面很烂)验证 PE 文件的证书/签名。

我已经从 PE 文件中提取了 DER PKCS7 证书,如下所述:http://blog.didierstevens.com/2008/01/11/the-case-of-the-missing-digital-signatures-tab/

我已经创建了一个没有校验和和签名数据的 PE 文件的修改版本,如下所述:http://www.mail-archive.com/cryptography@c2.net/msg04202.html

修改后文件的sha1sum与证书中的sha1sum一致。

我尝试使用 openssl 验证未签名、修改的 PE 文件:openssl smime -verify -in signature.der -content modified_executable.exe -inform DER -binary 但我只得到 ​​p>

验证失败 140415508248232:错误:21075075:PKCS7 例程:PKCS7_verify:证书验证错误:pk7_smime.c:342:验证错误:不支持的证书用途

如果我在命令中添加-noverify,我就会得到

验证失败 140595583981224:错误:21071065:PKCS7 例程:PKCS7_signatureVerify:摘要失败:pk7_doit.c:1097: 140595583981224:错误:21075069:PKCS7 例程:PKCS7_verify:签名失败:pk7_smime.c:410:

我错过了什么?

【问题讨论】:

标签: python openssl certificate signature authenticode


【解决方案1】:

假设:以下是在 Cygwin 上使用 OpenSSL 0.9.8e 完成的

对于“不支持的证书用途”,直接签名者可能没有 S/MIME 用途。

来自OpenSSL documentation:
-目的 目的
证书的预期用途。如果没有此选项,将不会进行链验证。
$ openssl x509 -用途 -in goodcert.pem -noout 证书用途: SSL 客户端:否 SSL 客户端 CA:否 SSL 服务器:否 SSL 服务器 CA : 否 网景 SSL 服务器:否 网景 SSL 服务器 CA:否 S/MIME 签名:否 S/MIME 签名 CA:否 S/MIME 加密:否 S/MIME 加密 CA:否 CRL 签名:否 CRL 签署 CA:否 任何目的:是的 任何目的 CA : 是

参考this,我添加了开关“- purpose any”。然后我不再看到“不支持的证书用途”,但仍然遇到与您相同的摘要和签名失败。

1900:错误:21071065:PKCS7 例程:PKCS7_signatureVerify:摘要失败:pk7_doit.c:948: 1900:错误:21075069:PKCS7 例程:PKCS7_verify:签名失败:pk7_smime.c:312:

根据this 的提示和大量研究(#1,#2),结果是输入“modified_exe”到 -content 是错误的。它应该是 PKCS #7 SignedData 的序列 ContentInfo 中的 content 字段,不包括其 DER 标记和长度字节。
SignedData的声明请参考Authenticode_PE.docx
(只是太多我认为不合适的细节包括!)

为清楚起见,请检查以下内容:

openssl asn1parse -inform der -in signature.der > signature.txt
head signature.txt -n30
    0:d=0  hl=4 l=5464 cons: SEQUENCE          
    4:d=1  hl=2 l=   9 prim: OBJECT            :pkcs7-signedData
   15:d=1  hl=4 l=5449 cons: cont [ 0 ]        
   19:d=2  hl=4 l=5445 cons: SEQUENCE          //SignedData
   23:d=3  hl=2 l=   1 prim: INTEGER           :01 //Version
   26:d=3  hl=2 l=  11 cons: SET               //DigestAlgorithmIdentifiers
   28:d=4  hl=2 l=   9 cons: SEQUENCE          
   30:d=5  hl=2 l=   5 prim: OBJECT            :sha1
   37:d=5  hl=2 l=   0 prim: NULL              
   39:d=3  hl=2 l= 104 cons: SEQUENCE          //ContentInfo
   41:d=4  hl=2 l=  10 prim: OBJECT            :1.3.6.1.4.1.311.2.1.4 //ContentType
   53:d=4  hl=2 l=  90 cons: cont [ 0 ]        
   55:d=5  hl=2 l=  88 cons: SEQUENCE          //SpcIndirectDataContent (exclude this tag and length bytes)
   57:d=6  hl=2 l=  51 cons: SEQUENCE          //SpcAttributeTypeAndOptionalValue
   59:d=7  hl=2 l=  10 prim: OBJECT            :1.3.6.1.4.1.311.2.1.15 //ObjectID
   71:d=7  hl=2 l=  37 cons: SEQUENCE          
   73:d=8  hl=2 l=   1 prim: BIT STRING        
   76:d=8  hl=2 l=  32 cons: cont [ 0 ]        
   78:d=9  hl=2 l=  30 cons: cont [ 2 ]        
   80:d=10 hl=2 l=  28 prim: cont [ 0 ]        
  110:d=6  hl=2 l=  33 cons: SEQUENCE          //DigestInfo
  112:d=7  hl=2 l=   9 cons: SEQUENCE          //AlgorithmIdentifier
  114:d=8  hl=2 l=   5 prim: OBJECT            :sha1 //ObjectID
  121:d=8  hl=2 l=   0 prim: NULL              
  123:d=7  hl=2 l=  20 prim: OCTET STRING      [HEX DUMP]:<hash of modified_exe> //digest OCTETSTRING
  145:d=3  hl=4 l=4774 cons: cont [ 0 ]        
  149:d=4  hl=4 l=1332 cons: SEQUENCE          
  153:d=5  hl=4 l= 796 cons: SEQUENCE          
  157:d=6  hl=2 l=   3 cons: cont [ 0 ]        
  159:d=7  hl=2 l=   1 prim: INTEGER           :02

从偏移量 57144 的字节流是 -content 的正确输入!
确切的偏移量取决于您的文件。
作为粗略的指导,“1.3.6.1.4.1.311.2.1.15”前两行是“SpcIndirectDataContent”,在这一行注意55+2+88-1=144。下一行从 57 开始。

最终命令:

openssl smime -verify -inform DER -in signature.der -binary -content signedData -CAfile myCA.crt - purpose any -out tmp

【讨论】:

    【解决方案2】:

    验证失败 140415508248232:error:21075075:PKCS7routines:PKCS7_verify:certificate 验证错误:pk7_smime.c:342:验证错误:不支持的证书用途

    正如@guest 已经指出的,OpenSSL 在验证smime(或cms)时有一个“功能”:它的行为就像-purpose smimesign 已通过。关于这个here的详细信息。

    如果您的 签名 证书与 OpenSSL 的 smimesign“用途”不兼容(请参阅 man x509CERTIFICATE EXTENSIONS 部分的“用途”列表),那么您必须禁用使用-purpose any 进行扩展检查(如果您的政策要求,请使用其他功能检查它们)。

    如果我将 -noverify 添加到命令中

    您可能不想这样做。此选项禁用对签名者证书的任何检查。

    【讨论】:

      【解决方案3】:

      我已经创建了一个没有校验和和签名数据的 PE 文件的修改版本,如下所述:http://www.mail-archive.com/cryptography@c2.net/msg04202.html

      为什么不直接使用微软发布的格式?无需求助于逆向工程。


      我错过了什么?

      PE/PE+ 可执行文件的部分文件已签名,而不是整个文件。在消化数据时,您必须省略OptionalHeader 中的校验和,省略Data Directory 中的证书表,并省略Attribute Certificate Table 部分。

      以下是您可能想熟悉的两个参考资料:

      要省略的部分显示在Windows Authenticode Portable Executable Signature Format,第 6 页。其转载如下。


      如果您需要帮助以编程方式了解 PE 文件格式,请参阅来自 MSDN 杂志的 Matt Pietrek 的 An In-Depth Look into the Win32 Portable Executable File Format

      【讨论】:

      • 正如我在问题中所写的那样,我已经剥离了未签名的部分,并且修改后的文件的哈希与提取的证书中的哈希相同。
      【解决方案4】:

      修改后文件的哈希值与提取证书中的哈希值一致

      我的错。我错过了那部分。

      这是您在pk7_smime.c 中失败的地方。它的线i = X509_verify_cert

      i = X509_verify_cert(&cert_ctx);
      if (i <= 0) j = X509_STORE_CTX_get_error(&cert_ctx);
      X509_STORE_CTX_cleanup(&cert_ctx);
      if (i <= 0) {
          PKCS7err(PKCS7_F_PKCS7_VERIFY,PKCS7_R_CERTIFICATE_VERIFY_ERROR);
          ERR_add_error_data(2, "Verify error:",
              X509_verify_cert_error_string(j));
          sk_X509_free(signers);
          return 0;
      }
      

      X509_verify_cert&lt;openssl dir&gt;/crypto/x509/x509_vfy.c 的第 150 行附近。它是一个相当大的函数(大约 250 行),因此您可能需要遍历它。

      在执行函数之前,您可以尝试将-signer 选项添加到openssl smime 函数。这可能是一个简单的修复。请参阅simime(3) 上的 OpenSSL 文档。

      我不知道从哪里获得签名证书,因为它不在我面前并且搜索“Microsoft Code Signing CA”会产生太多噪音。转储最终实体证书,找到颁发者,然后搜索颁发者的名称。

      【讨论】:

      • 签名者证书可能是文件中签名条目的一部分。对于 dropbox.exe,它具有以下证书:pastebin.com/wYPndWb9
      • “发行者:/C=US/O=Thawte, Inc./CN=Thawte 代码签名 CA - G2”。但它不提供在Thawte Root Certificates 下载。一家名为 TBS Internet 的公司将证书发布在 tbs-certificates.co.uk/FAQ/en/577.html
      • 但它在文件中。"主题:/C=US/O=Thawte, Inc./CN=Thawte 代码签名 CA - G2" "颁发者:/C=US/O=thawte , Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - 仅供授权使用/CN=thawte Primary Root CA" 直至西开普省
      • 也许您可以尝试使用cms(1)-CAfile 选项。在这种情况下,我会尝试保存 Thawte 根并明确将其提供给 openssl cms -verify。抱歉,我无法提供更多帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      相关资源
      最近更新 更多