在本文中,我们将创建一个利用CVE-2008-0166漏洞生成比特币地址(P2PKH)的工具。这是一个在早期Bitcoin Core软件客户端中寻找BTC硬币的研究项目。
随机数生成器会生成 可预测的数CVE-2008-0166
关键漏洞版本OpenSSL 0.9.8CVE-2008-0166仅以进程ID填充。由于字节序和sizeof(long)的差异,输出依赖于架构:32位大端(例如i386),64位大端(例如amd64, ia64),32位大端(例如powerpc, sparc)。PID 0是核心,PID_MAX(32768)无法通过移植达到,因此每个架构有32767个可能的随机数流。
Bitcoin Core软件客户端使用OpenSSL。具体来说,它使用函数«EC_KEY_generate_key()»生成比特币地址(作为密钥)来接收付款。旧版Bitcoin Core会在wallet.dat中生成并存储100个密钥。
只有在收到比特币付款时才会生成新密钥。因此,Bitcoin Core软件客户端维护一个包含100个未使用比特币密钥(地址)的池。内部随机数生成器的状态取决于在调用'EC_KEY_generate_key()'之前对库OpenSSL进行了哪些其他调用。影响RNG内部状态的挑战包括:«RAND_add(8)», «RAND_bytes(8)» 和 «RAND_bytes(32)»。
因此,研究需要查阅大量旧版比特币源代码,以找出在调用«EC_KEY_generate_key()».之前哪些调用影响了RNG的内部状态。调用路径在不同版本的Bitcoin Core软件客户端之间有所不同。
研究重点放在以下版本上:
| 发布日期 | 版本 |
我们的目标是为每个版本的Bitcoin Core软件客户端、每个架构(le32/le64)、每个进程ID以及比特币地址(P2PKH)生成私钥,使用来自关键漏洞OpenSSL 0.9.8.的随机数。
最终,我们将创建一个比特币地址生成器(P2PKH),所有内容将保存到文件result.txt中。
所有内容将存储在Google Drive文件存储中
为此,我们将使用来自Google Colab的«Ubuntu 18.04.5 LTS»发行版
此前我们录制了一份视频说明:«TERMINAL in Google Colab create all the conveniences for working in GITHUB»
在Terminal [TerminalGoogleColab]中打开Google Colab
运行命令:
cat /etc/lsb-release
«Ubuntu 18.04.5 LTS»
进入«CryptoDeepTools»仓库并查看详细信息
git clone https://github.com/demining/CryptoDeepTools.gitcd CryptoDeepTools/05VulnerableOpenSSL/
ls -lh
更新并安装g++ libgmp3-dev libmpfr-dev
apt-get update
sudo apt-get install g++ -y
安装 g++
sudo apt-get install libgmp3-dev libmpfr-dev -y
安装包 libgmp3-dev libmpfr-dev
为了让OpenSSL像CVE-2008-0166中那样再次脆弱化
下载openssl-0.9.8c.tar.gz并修补系统文件
wget https://ftp.openssl.org/source/old/0.9.x/openssl-0.9.8c.tar.gz
tar xfz openssl-0.9.8c.tar.gz
mv openssl-0.9.8c openssl-0.9.8c-vuln