以太Ethernaut靶场打靶—5 Token
-
- 概括
- 要求
- 源码审计
- 攻击流程
概括 本题主要利用智能合约里的整型溢出漏洞来实现攻击;
整型溢出:在 solidity 中,当一个整型变量高于或者低于他所能承受的范围时,就会发生溢出,导致一些不可预期的情况出现。例如,当用户转账金额超过系统预设的最大值时,只要用户金额大于零,用户就可以直接将巨额的代币转走。
要求 获取代币越多越好。
源码审计
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract Token {mapping(address => uint) balances;
uint public totalSupply;
constructor(uint _initialSupply) public {
balances[msg.sender] = totalSupply = _initialSupply;
}function transfer(address _to, uint _value) public returns (bool) {
require(balances[msg.sender] - _value >= 0);
balances[msg.sender] -= _value;
balances[_to] += _value;
return true;
}function balanceOf(address _owner) public view returns (uint balance) {
return balances[_owner];
}
}
由于balances[msg.sender]与_value都是uint型所以结果也是uint则balances[msg.sender] - _value >= 0一定是满足>=0的因为可能出现下溢。
这里通过源码可以看到在转载函数transfer里直接用的运算符导致没有对溢出作检测
balances[msg.sender] -= _value;
同时我们的账户里只有20个代币
那就可以通过利用减法溢出转走合约里的代币
function transfer(address _to, uint _value) public returns (bool) {
require(balances[msg.sender] - _value >= 0);
balances[msg.sender] -= _value;
balances[_to] += _value;
return true;
}
攻击流程 【Ethernaut靶场通关记录|以太Ethernaut靶场打靶—5 Token】首先调用balanceOf可以看到当前账户只有20个代币
文章图片
然后直接调用transfer函数向合约地址转21个导致溢出看会发生什么情况
文章图片
此时再查看我的账户里有多少代币
文章图片
成功,提交实例
文章图片
推荐阅读
- fabric|Hyperledger Explorer(区块链浏览器) 环境搭建
- Ethernaut靶场通关记录|以太Ethernaut靶场打靶—3Coin Flip
- Ethernaut靶场通关记录|以太Ethernaut靶场打靶—6 Delegation
- Ethernaut靶场通关记录|以太Ethernaut靶场打靶—1 Fallback
- Ethernaut靶场通关记录|以太Ethernaut靶场打靶—0 Hello Ethernaut
- 区块链探索|[Near Protocol] Near开发Demo浅析-Gamble Game Near(二)(Dapp)
- 区块链探索|[论文分享]基于区块链技术的服务端资源权限控制系统设计与实现
- 区块链探索|[论文分享]去中心化金融(DeFi)安全与防护现状
- 私域流量如何布局(企业如何利用私域流量避免"卖货难"?)