作者前文介绍了什么是数字签名,并采用Signtool工具对EXE文件进行签名,后续深入分析数字签名的格式及PE病毒内容。这篇文章将详细解析数字签名,采用Signtool工具对EXE文件进行签名,接着利用Asn1View、PEVie、010Editor等工具进行数据提取和分析,这是全网非常新的一篇文章,希望对您有所帮助。这些基础性知识不仅和系统安全相关,同样与我们身边常用的软件、文档、操作系统紧密联系,希望这些知识对您有所帮助,更希望大家提高安全意识,安全保障任重道远。本文参考了参考文献中的文章,并结合自己的经验和实践进行撰写,也推荐大家阅读参考文献。
文章目录:
从2019年7月开始,我来到了一个陌生的专业——网络空间安全。初入安全领域,是非常痛苦和难受的,要学的东西太多、涉及面太广,但好在自己通过分享100篇“网络安全自学”系列文章,艰难前行着。感恩这一年相识、相知、相趣的安全大佬和朋友们,如果写得不好或不足之处,还请大家海涵! 接下来我将开启新的安全系列,叫“系统安全”,也是免费的100篇文章,作者将更加深入的去研究恶意样本分析、逆向分析、内网渗透、网络攻防实战等,也将通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步,加油~ 推荐前文:网络安全自学篇系列-100篇 https://blog.csdn.net/eastmount/category_9183790.htm
作者的github资源:
声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。该样本不会分享给大家,分析工具会分享。(参考文献见后)
PE文件数字签名能够有效保证文件未被非法篡改,安全软件通过验证文件是否有正规厂商的数字签名来降低误报。其基本流程如下图所示:
签名:
验证:
PE文件数字签名所使用的工具包括:
我们首先需要通过makecert.exe工具生成证书test.cer和私钥文件test.PVK,接着调用signcode.exe工具对目标PE文件(test.exe)进行数字签名。其中,通过makecert.exe生成需要的证书常见参数如下:
Error: Invalid algorithm
Usage: MakeCert [ basic|extended options] [outputCertificateFile]
Extended Options
-sc <file> Subject's certificate file
-sv <pvkFile> Subject's PVK file; To be created if not present
-ic <file> Issuer's certificate file
-ik <keyName> Issuer's key container name
-iv <pvkFile> Issuer's PVK file
-is <store> Issuer's certificate store name.
-ir <location> Issuer's certificate store location
<CurrentUser|LocalMachine>. Default to 'CurrentUser'
-in <name> Issuer's certificate common name.(eg: Fred Dews)
-a <algorithm> The signature algorithm
<md5|sha1>. Default to 'md5'
-ip <provider> Issuer's CryptoAPI provider's name
-iy <type> Issuer's CryptoAPI provider's type
-sp <provider> Subject's CryptoAPI provider's name
-sy <type> Subject's CryptoAPI provider's type
-iky <keytype> Issuer key type
<signature|exchange|<integer>>.
-sky <keytype> Subject key type
<signature|exchange|<integer>>.
-d <name> Display name for the subject
-l <link> Link to the policy information (such as a URL)
-cy <certType> Certificate types
<end|authority|both>
-b <mm/dd/yyyy> Start of the validity period; default to now.
-m <number> The number of months for the cert validity period
-e <mm/dd/yyyy> End of validity period; defaults to 2039
-h <number> Max height of the tree below this cert
-r Create a self signed certificate
-nscp Include netscape client auth extension
-eku <oid[<,oid>]> Comma separated enhanced key usage OIDs
-? Return a list of basic options
-! Return a list of extended options
第一步,打开CMD调用makecert.exe并输入命令生成证书文件。 参数表示自签名、个人软件、授权者为YXZ、组织单位是WHU、国家及省份,散列算法采用md5,有效期是2020-03-16到2030-01-01。
makecert -r -$ "individual" /sv "test.PVK" -n "CN=YXZ,O=WHU,C=China,S=Hubei"
-a md5 -b 03/16/2020 -e 01/01/2030 test.cer
需要注意设置密码如“123456”,成功之后,可以看到新增加的两个证书和私钥文件。
第二步,双击test.cer点击“安装证书”,并设置信任根证书机构。
信任之后,此时的证书是受信任且合法的,查看证书详细信息,能够看到签名算法md5RSA、散列算法md5、颁发者信息及有效期等,如下图所示。
第三步,利用signcode工具进行数据签名。 选择需要加密的“test02.exe”文件。
选择我们生成的数字证书“test.cer”和私钥文件“test.PVK”。
注意,这里的散列算法选择“SHA1”。这里的散列算法是PE文件的签名信息, 而之前makecert.exe设置的md5是证书的散列算法。
暂时不设置时间戳,最终成功为“test02.exe”进行数字签名。
第四步,打开test02.exe文件属性,可以看到它增加了一个“数字签名”的区域,并且能够看到此数字签名是正常的及详细信息。
第五步,我们采用PEView打开已签名和未签名的PE文件对比,发现CERTIFICATE Table区域为前面信息。
注意:图中PPT均为作者制作,相关视频在网易云中查看。
PE文件数字签名信息存放在Certificate Table位置,同时PE文件可选文件头DataDirecotry第5项记录文件偏移及大小。下图为PE文件数字前面的PKCS#7格式。参考文献:
第一步,使用PEView查看签名的test02.exe文件,可以看到Certificate Table存储相关签名信息。
文件开始位置:00000A00(长度:488H)
对应的结构:
第二步,在PE文件可选文件头DataDirecotry第5项查看文件签名信息的偏移及大小。 此时的偏移地址是“00000A00”、大小为488H,而未前面的PE文件其值均为0。
第三步,wRevision表示证书的版本号,wCertificateType表示证书类型,其值为0x0002,表示包含PKCS#7的SignedData结构。接下来我们对所提取的签名数据,就需要用该格式进行解析。
第一步,通过010Editor打开签名后的test02.exe文件。
第二步,这里推荐读者在010Editor中导入PE文件解析模板,方便对PE文件的解析。
模板运行结果如下图所示,我们可以查看各个区域的信息。后一篇文章将讲解PE文件的存储格式。
第三步,通过运行模板找到数字签名的偏移地址0A00h和大小488h。
第四步,定位到签名偏移地址00000A00,Certificate Table从第9个字节开始后为签名信息,将其复制另存为另一个文件,如“test02.dat”。
此时我们的签名信息成功导出,后续需要进行数据分析。
PKCS#7 微软官方文档 一个 PKCS#7 SignedData结构包括PE文件的哈希值,一个被软件出版厂商的私钥创建的签名,和将软件出版厂商的签名密钥和法人代表进行绑定的(系列)X.509 v3 证书。PKCS#7 1.5 版本规范定义了关于 SignedData 的 ASN.1(抽象语法符号)结构,如下图所示:
注意,导出的“test02.dat”签名数据为 ASN.1抽象结构,需要采用ASN1View或ASN1Dump进行解析,其效果如下图所示:
第一步,调用ASN1Dump打开“test02.dat”解析基础数据。
每个字段有对应的flag,比如:
第二步,获取证书颁发者信息,包括md5withRSA签名、证书颁发者YXZ、组织WHU、国家及省份。 每块数据通常有一个标记变量,标记变量对应有相关值,比如颁发者标记2.5.4.3和颁发者YXZ、散列算法和散列值等。
第三步,其他相关信息。
核心数据包括:
注意,RSA签名后的数据和公钥值会还原出来第一个hash值,摘要数据和散列算法将计算第二个hash值。如果两个值一致,则表示该PE文件在传输过程中未被篡改或破坏,且受信任;否则已经被破坏。
第一步,回顾我们前面的签名信息和证书信息。如下图所示,PE文章签名信息的散列算法是SHA1、签名算法是RSA,签名证书的散列算法是MD5。
第二步,采用ASN1View打开“test02.dat”。 主要由三部分组成,左边是树形ASN1层次结构,右上部分是地址、数据和值,右下部分是对应的解析结构。接着回到最早的签名结构图,我们分别对每部分数据进行分析。
第三步,分析Contentinfo部分数据。 该部分主要存储PE文件的hash值、以及标记变量、散列算法等。
比如sha1散列算法。
第四步,分析Certificates部分数据。 该部分主要存储证书相关信息,包括证书发布者、证书时间戳等信息。注意,该部分内容可以直接导出,再和“test02.exe”的数字证书进行对比。
比如省份“Hubei”。
接下来,我们需要导出该部分的证书信息。下图的前4个字节为地址和大小,我们从“30 82”开始复制。这里采用010Editor工具复制。
第五步,采用010Editor导出证书部分数据,并进行对比实验。
对比从010Editor导出的“output.cer”证书和“test02.exe”数字签名信息,发现是一致的(包括公钥),该实验也证明了签名数据的第二部分为证书信息。
第六部分,分析Signerinfos部分数据。 该部分主要存储签名使用者的信息、签名的hash、时间戳、UTC时间、摘要信息、签名算法等。
如下图所示,第三部分的长度为360,从“30 82”开始为第三部分的具体值。
重要的值包括:
这里我提出一个问题:恶意软件是否能隐藏合法证书并进行签名呢?PE签名文件是否能新增数据而不影响签名的效果呢?
Chrome浏览器中签名目录曾附加数据(配置数据或许可证信息),如GotoMyPc、PowerGrep、RegexBuddy等。那么我们是否也能完成相关的实验呢?
当我们修改PE文件的签名数据或新增错误数据时,该PE文件的签名信息会显示被破坏。如何有效的新增数据呢?下面开始我们的实验。
第一步,用010Editor打开已签名的“test02.exe”文件,并导入PE模板。
第二步,修改PE文件数字签名的Certificate Table大小,我们将488h修改为498h,相当于增加16h。
第三步,并且在数字签名的末尾增加16h内容 需要注意,增加的字节为8的倍数。
第四步,查看“test02.exe”属性,发现数字签名仍然存在且正常。
最终我们成功的在数字签名后增加信息,并且没有破坏数字签名。如果我们将恶意代码隐藏在该数字签名中,是不是其危害更大,如果能绕过杀毒软件并进行相关的hook或植入,是不是非常可怕呢?
文章写到这里,就介绍完毕,本文主要讲解PE文件数字签名,并对其进行详细解析,属于系统安全和PE逆向相关知识,希望对您有所帮助。内容包括:
文章同时也加深了读者对相关PE解析工具的使用理解,包括:
后续将学习PE文件结构知识、图标修改、对话框分析、EXE解析、加壳解密等。希望这系列文章对您有所帮助,同时真的感觉自己技术好菜,要学的知识好多。从网络安全到系统安全,从木马病毒到后门劫持,从恶意代码到溯源分析,从渗透工具到二进制工具,还有Python安全、安全论文、黑客比赛和漏洞分享。未知攻焉知防,人生漫漫其路远兮,作为初学者,自己真是爬着前行,感谢很多人的帮助,继续爬着,继续加油!
学安全一年,认识了很多安全大佬和朋友,希望大家一起进步。这篇文章中如果存在一些不足,还请海涵。作者作为网络安全和系统安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,感谢师傅、实验室小伙伴的教导,深知自己很菜,得努力前行。编程没有捷径,逆向也没有捷径,它们都是搬砖活,少琢磨技巧,干就对了。什么时候你把攻击对手按在地上摩擦,你就赢了,也会慢慢形成了自己的安全经验和技巧。加油吧,少年希望这个路线对你有所帮助,共勉。
前文回顾(下面的超链接可以点击喔):
2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教!谢谢。2021年继续加油!
参考文献: