Skip to content

Commit

Permalink
20240921
Browse files Browse the repository at this point in the history
  • Loading branch information
0xNezha committed Sep 21, 2024
1 parent 4a01873 commit 8c42dde
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 1 deletion.
5 changes: 4 additions & 1 deletion 0xNezha.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,5 +93,8 @@ bytes32[3] private data 通过合约调用的方式当然无法读取 private
这一关主要考察 ERC20 的 ABI,该代币的持有者无法直接转账,必须等锁定期过了才能转。但如果把全部额度授权给第三人,则第三人可以把代币全部提走。主要使用 approve(address _spender, uint256 _value) 和 transferFrom(address _from, address _to, uint256 _value)。 [15_NaughtCoin](./Writeup/0xNezha/Ethernaut/15_NaughtCoin.md)

### 2024.09.20
这一关主要考察delegatecall()。目标合约想要通过 timeZone1Library.delegatecall(abi.encodePacked(setTimeSignature, _timeStamp)) 来调用库合约的 setTime(uint256 _time) 达到修改目标合约中 uint256 storedTime 变量的目的。然而使用 delegatecall() 函数进行外部调用时,当涉及到 storage 变量的修改时,是根据 slot 的位置来修改的,而不是通过变量名。也就是说库合约中的 uint256 storedTime 位于 slot0,则目标合约调用外部函数时,修改的也是目标合约的 slot0,而不是位于其他 slot 的变量 storedTime。
这一关主要考察delegatecall()。目标合约想要通过 timeZone1Library.delegatecall(abi.encodePacked(setTimeSignature, _timeStamp)) 来调用库合约的 setTime(uint256 _time) 达到修改目标合约中 uint256 storedTime 变量的目的。然而使用 delegatecall() 函数进行外部调用时,当涉及到 storage 变量的修改时,是根据 slot 的位置来修改的,而不是通过变量名。也就是说库合约中的 uint256 storedTime 位于 slot0,则目标合约调用外部函数时,修改的也是目标合约的 slot0,而不是位于其他 slot 的变量 storedTime。[16_Preservation](./Writeup/0xNezha/Ethernaut/16_Preservation/16_Preservation.md)

### 2024.09.21
这一关主要考察 合约地址的计算和 destroy() 的应用。合约地址计算就不多说了,也可以在区块浏览器中直接查到合约地址,然后调用 destroy() [17_Recovery](./Writeup/0xNezha/Ethernaut/17_Recovery.md)
<!-- Content_END -->
14 changes: 14 additions & 0 deletions Writeup/0xNezha/Ethernaut/17_Recovery.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
### 第15关:NaughtCoin

这一关主要考察 ERC20 的 ABI,该代币的持有者无法直接转账,必须等锁定期过了才能转。但如果把全部额度授权给第三人,则第三人可以把代币全部提走。

1.攻击者把代币授权给第三人
```shell
cast send 0x目标代币地址 "approve(address _spender, uint256 _value)" 0x第三人的地址 代币的数量 --rpc-url=https://blastapi.io --private-key=攻击者的私钥
```
2.第三人把代币转移走
```shell
cast send 0x目标代币地址 "transferFrom(address _from, address _to, uint256 _value)" 0x攻击者的地址 0x第三人的地址 代币的数量 --rpc-url=https://blastapi.io --private-key=第三人的私钥
```

点击 Submit Instance, 过关。

0 comments on commit 8c42dde

Please sign in to comment.