Token
1. 题目要求
1.1 这一关的目标是攻破下面这个基础 token 合约
1.2 你最开始有20个 token, 如果你通过某种方法可以增加你手中的 token 数量,你就可以通过这一关,当然越多越好
1.3 合约代码:
1 | // SPDX-License-Identifier: MIT |
2. 分析
2.1 编译器版本:
^0.6.0
,且没用SafeMath库,所以可能出现整数溢出漏洞2.2 代码分析:
require(balances[msg.sender] - _value >= 0);
检查用户余额是否大于或等于零,但由于余额是无符号整数,当我们减去的数字 (_value
) 大于代balances[msg.sender]
币的钱包余额 ( ) 时,就会发生溢出,钱包余额变为最大无符号整数减去这两个值之间的差值。通过 require 语句后,还有一个错误是将这个溢出的值赋值给 的余额
msg.sender
:2.3 攻击合约:
1 | contract Hack { |
- 2.4 调用Hack 合约中的 attract() 函数
3. 解题
3.1 获取关卡实例地址:0x03130C8ca692f8980461A9C96411aAf5e0A71AcB
3.2 部署攻击合约
3.3 查看我的钱包地址的余额
3.4 开始合约攻击,并查看余额
3.5 提交实例,返回结果,成功!!!