恶意代码 第三章作业3

第三章作业3

0.PE文件数字签名原理

签名

  • 软件发布者使用散列算法(如MD5或SHA)计算PE文件的散列值。
  • 软件发布者使用私钥对散列值进行签名得到签名数据。
  • 将签名私钥对应的公钥和签名数据等以证书的形式附加在PE文件之中,形成经过数字签名的PE文件。
  • 软件发布者将经过数字签名的PE文件进行发布。

验签

  • 从PE文件证书中提取软件发布者的公钥、使用的散列算法、签名算法、原始散列值的签名数据。
  • 使用提取的公钥和对应签名验证算法将签名数据还原为原始PE文件的原始散列值。
  • 对现有PE文件使用同样的散列算法计算出对应的散列值。
  • 对比两个散列值是否一致,从而判断数据是否被破坏和篡改。

image-20210418232222864

图0.1

1.对Hello25.exe进行数字签名

(1)生成证书和私钥

在windows下使用管理员模式打开cmd,cd到makecert.exe所在目录下,执行以下指令以生成证书和私钥

常用参数(输入makecert -help可查看帮助文档):

  • -r: 自签名
  • -n: 证书名称,格式为-n “CN=名称, E=Email,O=组织名称,C=国家, S=省份(州), P=县城”
  • -a: 指定散列算法,其值必须是md5(默认值)或SHA1
  • -$: 指定证书的签名权限,其值必须是commercial(商业软件)或individual(个人软件)
  • -b: 证书有效期的开始时间,格式为月/日/年(例如04/18/2021)
  • -e: 证书有效期的结束时间,格式为月/日/年
makecert -r -$ "individual" /sv "test_pvk.PVK" -n "CN=whb,O=besti,C=China,S=BeiJing" -a md5 -b 04/18/2021 -e 01/01/2030 test_cer.cer

输入私钥密码,不需要也太复杂

微信图片_20210418173433

图1.1

输入上一步设置好的密码

微信图片_202104181734331

图1.2

成功运行

image-20210418233503960

图1.3

出现了证书和私钥

微信图片_202104181734332

图1.4

(2)使用私钥进行签名并附加相应证书

双击证书打开,会显示不受信任,安装一下就好了,单击安装证书

微信图片_202104181734333

图1.5

选择当前用户,单击下一步

微信图片_202104181734334

图1.6

选择将所有证书都放入下列存储,单击浏览,选择受信任的根证书颁发机构

微信图片_202104181734335

图1.7

单击完成即可

微信图片_202104181734336

图1.8

再次打开就会信任此证书

微信图片_202104181734337

图1.9

单击详细信息就可以查看证书的版本、序列号、签名哈希算法等参数

微信图片_202104181734338

图1.10

右键signcode.exe以管理员身份运行为Hello25.exe签名

微信图片_202104181734339

图1.11

单击浏览选择文件路径(我这里重命名了一下)

微信图片_2021041817343310

图1.12

单击自定义,然后下一步

微信图片_2021041817343312

图1.13

单击从文件中选择,找到之前生成的证书文件,选择X.509证书,单击打开,下一步

微信图片_2021041817343313

图1.14

选择磁盘上的私钥文件,单击浏览找到之前生成的.PVK文件,下一步

微信图片_2021041817343315

图1.15

签名算法选择sha1(这里的散列算法是PE文件的签名信息, 而之前makecert.exe设置的md5是证书的散列算法。)

微信图片_2021041817343316

图1.16

选择“证书路径中的所有证书,包括根证书”,下一步,之后单击完成即可

微信图片_2021041817343317

图1.17

弹出下面这个弹窗即成功签名,文件的属性也会多一栏信息,可以点击详细信息查看

微信图片_2021041817343319

图1.18

微信图片_2021041817343320

图1.19

2.解析证书信息和程序中所带的签名信息

使用PEview查看程序 发现多了一个数字签名

微信图片_2021041817343321

图2.1

在数据目录表中找到验证表的偏移量为0x00000A00,大小为0x000004B0

微信图片_2021041817343322

图2.2

来到签名对应的位置,前4字节代表表项长度,值为0x000004B0,与数据目录表一致;后面两字节为证书版本,值为0x0200,表示版本号为WIN_CERT_REVISION_2,还有一个0x0100代表WIN_CERT_REVISION_1,但不太常用;最后两字节代表证书类型,值为0x0002,意为包含PKCS#7的SigneData的结构,后面一直到结束都是签名的具体内容。

微信图片_2021041817343323

图2.3

使用010 Editor打开文件,复制签名数据,从第9字节开始,到末尾的0x00结束

微信图片_2021041817343324

图2.4

微信图片_2021041817343325

图2.5

鼠标右键选择selection,单击Save Selection,选好要存储的目录保存即可

微信图片_2021041817343326

图2.6

由于导出的签名数据为ASN.1的数据结构,所以需要``ASN1ViewASN1Dump进行解析,我这里采用的是ASN1Dump`进行分析

内容所遵守的标准编码和签名信息

  • 指定SignedData结构
    值为“1.2.840.113549.1.7.2”,表示采用PKCS#7结构

  • 生成签名的哈希算法
    图中为SHA1:1.3.14.3.2.26

    MD5:1.2.840.113549.2.5

    SHA256 2.16.840.1.101.3.4.2.1

  • 签名属性
    SPC:1.3.6.1.4.1.311.2.1.4

image-20210419090049349

图2.7

证书信息

获取证书颁发者信息,包括md5withRSA签名、证书颁发者、组织、国家及省份

微信图片_2021041817343328

图2.8

还存储了证书有效时间和RSA公钥等信息

微信图片_2021041817343329

图2.9

image-20210419093739776

图2.10

微信图片_2021041817343330

图2.11

image-20210419092225946

图2.12

RSA签名后的数据和公钥值会还原出来第一个hash值,摘要数据存储hash值。如果两个值一致,则表示该PE文件在传输过程中未被篡改或破坏,且受信任;否则已经被破坏

使用ASN1View解析会把数据基本分析好,只需要查看就行

image-20210419085448765

图2.13

3.按照实践1修改程序后再次查看签名信息

修改后发现证书无效,原因应该是摘要值发生了改变

具体修改方式见博客园链接

微信图片_2021041817343332

图3.1

我们提前在另一原始程序中重新进行上述更改(未进行数字签名),将前6个字节改为我们所需要的效果,多余的两字节直接改为00即可,保存之后重新签名

image-20210419193029418

图3.2

复制新程序没有问题的数字签名

image-20210419193611112

图3.3

前面8字节都是一样的,可以不复制,把有问题的签名直接覆盖掉

image-20210419193850816

图3.4

修改完成后数字签名显示正常

4.修改带有有效签名的文件,使得签名仍然有效

使用010 Editor打开程序,修改签名大小为0x000004B8

微信图片_2021041817343333

图4.1

在签名的最后添加一串字符

微信图片_2021041817343334

图4.2

保存,证书依然有效

image-20210419094950822

图4.3

将一个PE文件可以直接嵌入数字签名中,修改大小为0x568=0x4a0+0xc80xc8=200为PE文件的大小

image-20210419194728699

将PE文件内容直接粘贴就好了

image-20210419194819301

修改完成后数字签名显示正常

5.如何更有效的检测数字签名

①对时间戳检验

右键属性,详细信息可以查看签名时间

image-20210419110253347

图5.1

virustotal网站对PE文件检验

即使数字签名正常,PE文件也不一定是绝对安全的,最好检验一下

image-20210419111135841

图5.2

原程序的检验

image-20210419110952205

图5.3

修改后数字签名正常的情况下程序的检验

问题

修改签名使签名仍然有效,增加的字节数必须是8的整数倍,否则证书就会失效,不太理解为什么(不过PE文件中的信息是使用了0x00补齐8字节的),对签名验签的流程不太懂

使用文件中给出的公钥,签名值,散列值验签失败

参考文章

[网络安全自学篇] 六十一.PE文件逆向之数字签名详细解析 作者: Eastmount

恶意文件分析中的数字签名验证 作者:李志昕

原文地址:https://www.cnblogs.com/wqnmlkb/p/14676137.html