# ethernaut 答案

By [Michael Liu](https://paragraph.com/@michaell) · 2022-07-08

---

### 第零关

![](https://storage.googleapis.com/papyrus_images/d20da70c04084103fc11b0a9691d64912f48633f8ed1c11d046225b31fe12cbf.png)

![](https://storage.googleapis.com/papyrus_images/bbac68094b9ab6512e00e75951cfdde9a134448894e6375aa3b51b2b87709c01.png)

![](https://storage.googleapis.com/papyrus_images/635810a3a578517becc9c05b5fa28ca0d49dd514278428cc952a40ef5dd66c15.png)

### 第一关

可以看到代码中有映射类型的 contributions，从构造函数中可以看出，原来的所有权控制者的 contributions 是 1000 eth

第一种思路是可以通过 contribute 函数提高用户在 contributions 数组的值，如果某个地址的 contributions 汁超过了 owner，那么这个地址就会成为新的 owner，这点比较难以满足，因为注意到代码中有判断语句，要求每次 call contribute 函数的数值都必须小于 0.001 ether，那么要达到 1000 eth，就至少要 call 1000000 次，很难实现

第二种思路是注意到 receive 函数，receive 函数定义如下

![](https://storage.googleapis.com/papyrus_images/b3476a49440a11eb1859fd0af0ad856569d87ef6ebccf1bbca2f6be090799f4c.png)

所以只需要我们朝这个合约发送 eth，那么就会触发这个函数，再看这个函数的逻辑，只需要发送的以太数量大于零且发送者的 contribute 大于 0，那么就会把合约的 owner 改为调用者，所以需要做的很简单

1.  call contribute 函数，注意数量必须小于 0.001 ether
    
2.  朝合约发送一笔数量大于 0 ETH 的交易
    
3.  之后再调用 withdraw 提出所有余额就好了
    

![](https://storage.googleapis.com/papyrus_images/9c37f3160e03c96d718287a58d0d0abfca4ce4eba8742764b1b6af7ce3fc0f95.png)

![](https://storage.googleapis.com/papyrus_images/cd7269be73d44471a55c53510846d4009aae5bc365b9c906e3903e71103a5be3.png)

![](https://storage.googleapis.com/papyrus_images/51dac6c4daaa8571f189818ab3db5a971d83c6c027e9a47b209c7e16a80d2aae.png)

---

*Originally published on [Michael Liu](https://paragraph.com/@michaell/ethernaut)*
