[原创]wibu证书 - 安全证书(一)
2022-10-25 21:54 6061
上节的最后,我们拿到asn1码流定义和几份证书,这节将会讲讲这些证书是如何使用的,以及证书的密钥到底从何而来。计算证书密钥的篇幅较长,可能会分为几部分进行讲解。
大多数人对于证书的概念都是从https中来的,而https中的证书只是证书的其中一种用法。证书存在的目的是保护数据不被篡改,这些数据包括了类似https这种通信过程中的流式数据,也包括了如驱动等这种文件形式的静态数据。
一份证书既要保证数据不能被黑客篡改,也要保证证书自身不被黑客篡改。证书保证自身不被篡改可以通过保存自身的哈希值,校验时从新计算哈希值再比较是否匹配即可,由于该过程无需其他信息介入,一般称之为自校验。另一种方法就是证书链,验证时需要依赖其他信息。证书链首先需要由机构(如CA)或个人颁发可信的根证书,再由根证书派生子证书,子证书的有效性需要由其父证书来验证,这样构成一条信任链。那么根证书又由谁来验证呢?根证书通常使用自校验来保护自身,在联网的情况下,还可以由颁发机构来确认根证书的有效性,所以证书的来源很重要。在访问https网址时,如果证书不是由权威机构颁发的,浏览器会提醒不安全的证书,不要输入任何银行相关信息,是不是很有画面感。
在CodeMeterLin中,通过binwalk发现一份写死的X509格式的证书,将该证书dump出来,发现其就是CodeMeter在授权过程中的根证书。在之后的crack中有可能需要替换该证书。
证书密钥生成依赖很多信息,其中绝大部分是系统的一些信息,这些信息会保存在cache目录下以wbc结尾的文件,下面是其中一份例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|
每个item是系统参数的sha256值,只有每个sha256对上了,这份wbc文件才会被使用。
每一个获取系统参数的函数都对应一个编号,下图左侧是在间接调用函数获取系统信息,右侧是绑定编号和函数的过程。
以编号5001的函数为例,先看看该函数体。可以看到有一串奇怪的字符串,它的解码方式也很简单,ascii值减1就是正确的值,所以最后的字符串应该为/proc/sys/kernel/hostname,显然这个函数获取的是主机名。其他函数也有类似的编码字符串,解码方式都十分简单的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
下面总结了不同编号对应的功能
编号 | 功能 |
---|---|
5001 | /proc/sys/kernel/hostname |
5002 | /sys/bus/i2c/drivers/i2c_adapter/module/srcversion |
5003 | |
6001 | |
6101 | /sys/class/dmi/id/product_name |
6102 | /sys/class/dmi/id/product_version |
6103 | /sys/class/dmi/id/sys_vendor |
6104 | /sys/class/dmi/id/board_version |
6105 | /sys/class/dmi/id/board_vendor |
6106 | /sys/class/dmi/id/board_name |
6107 | /sys/class/dmi/id/bios_date |
6108 | /sys/class/dmi/id/bios_vendor |
6109 | /sys/class/dmi/id/bios_version |
6110 | 运行/usr/bin/codemeter-info命令 |
7001 | 硬盘相关 |
7002 | 硬盘相关 |
7003 | 硬盘相关 |
8001 | |
8002 | /sys/class/power_supply |
8003 | /sys/class/drm |
8004 | |
8005 | 运行/usr/bin/codemeter-info命令 |
未完待续