---
# System prepended metadata

title: Ethernaut 解題

---

# Ethernaut 解題


### 1. ****Hello Ethernaut****

要了解如何與 ethernaut 合約實體互動，使用瀏覽器 console


### 2. ****Fallback****

a. 先使用 contribute() 成為合約 owner

b. 然後使用 send() 送進大於 1000 Ether

c. 最後將合約 eth 使用 withdraw() 全部提出來，使餘額歸零

![](https://i.imgur.com/3FogxYd.png)


### 3. ****Fallout****
裡面有一個 funtion 寫錯了，寫成 Fal1out ，直接呼叫即可成為 owner

![](https://i.imgur.com/WQefczc.png)


### 4. ****CoinFlip****

主要漏洞在於用 block.number 這固定數來計算，可以在調用 function 之前運行相同的演算法，就可以計算出相同的正確答案。

![](https://i.imgur.com/7NgcDIm.png)


### 5. ****Telephone****

如果在合約A中呼叫合約B，則 msg.sender會是 B 而不是你的 EOA  

![](https://i.imgur.com/mJcMM8B.png)


### 6. ****Token****
舊版的 solidity 會有溢出問題。傳遞一個大於20的值，第一個條件就會通過。

![](https://i.imgur.com/xLHXSo8.png)

### 7. ****Delegation****
從 Delegation 呼叫 Delegate 中的 pwn 即可成為 owner，可以使用 web3 或是 calldata 呼叫

```solidity=
let payload = web3.eth.abi.encodeFunctionSignature({
    name: 'pwn',
    type: 'function',
    inputs: []
});

await web3.eth.sendTransaction({
    from: player,
    to: instance,
    data: payload
});
```
![](https://i.imgur.com/qA5P9ql.png)

### 8. ****Force****

題目合約沒有 fallback 或是任何 payable funtion，強制給它錢即可過關。自己寫一個合約摧毀自己，記得加上 payable，讓題目合約有餘額即可。


``` solidity=
function attack() payable public{
    selfdestruct(addr);
}
```

![](https://i.imgur.com/5rVy7le.png)

### 9. ****Vault****

打開保險箱即可過關。宣告成 private 的變數雖然其他合約無法使用，但這是可以被看到的，使用 web3js 中的 getStorageAt 即可取得 password。之後再把 password 傳到 unlock 即可破解。

``` javascript=
const password = await web3.eth.getStorageAt(instance, 1);
contract.unlock(password);
```

![](https://i.imgur.com/pGBQzjP.png)


### 10. ****King****








