zoukankan      html  css  js  c++  java
  • 恶意代码 第三章作业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

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

  • 相关阅读:
    计算器算法的简单实现
    [备忘]如何在Asp.net MVC,非Controller中获取当前Request,Session,Response等请求信息
    [Easy UI ]DataGrid 首次进入页面时,不加载任何数据
    使用Hyperv搭建oracle11gR2 RAC过程中遇到问题记录
    Win oracle10g 不同目录rman恢复记录
    ORACLE RAC 日常管理[10g,11g]
    win2008 11gRAC 环境 安装步骤记录 【前期配置简略】
    本地登录和远程登陆总结[oracle ,资料收集于网络]
    Oracle10g RAC 修改IP [转载]
    安装DNS Server linux 【转载】
  • 原文地址:https://www.cnblogs.com/wqnmlkb/p/14676137.html
Copyright © 2011-2022 走看看