Overflow

Ethernaut - 令牌挑戰

  • April 15, 2022
// 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];
 }
}

合約實例提供msg.sender20 個代幣。我知道overflow攻擊是如何工作的,我不明白的是require當有人呼叫傳輸函式時檢查是如何通過的transfer(0x0, 21),在哪裡20-21 is negative!

Require 不尋找溢出,這是一個簡單的檢查,但挑戰的解決方案以某種方式起作用。

我想我知道為什麼..

balances將地址映射到uint. 在 require 檢查中, uintuint - uint = uint在哪裡20-21 = -1下溢……這很討厭。

如果我記得這裡的情況是您向自己(向)發送一個大數字(值)(maxUINT NUMBER)。因此,您將使用 :

balances完成程式碼

$$ _to $$+= _值;

*你的地址在哪裡

*和價值=非常大的數字 摘要:您將向自己發送一個非常大的數字(maxuintnumber)。
最後,您將完成
餘額

$$ _to $$+= _值;<br 並且您的餘額中將獲得一個很大的數字

引用自:https://ethereum.stackexchange.com/questions/126236