From 8c42dde791fc8a1e3c4a4c6e91fda4aabfb8cd11 Mon Sep 17 00:00:00 2001 From: 0xNezha Date: Sat, 21 Sep 2024 23:34:41 +0800 Subject: [PATCH] 20240921 --- 0xNezha.md | 5 ++++- .../15_NaughtCoin - \345\211\257\346\234\254.md" | 0 Writeup/0xNezha/Ethernaut/17_Recovery.md | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) rename Writeup/0xNezha/Ethernaut/15_NaughtCoin.md => "Writeup/0xNezha/Ethernaut/15_NaughtCoin - \345\211\257\346\234\254.md" (100%) create mode 100644 Writeup/0xNezha/Ethernaut/17_Recovery.md diff --git a/0xNezha.md b/0xNezha.md index c784100a..c0dfedcb 100644 --- a/0xNezha.md +++ b/0xNezha.md @@ -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) diff --git a/Writeup/0xNezha/Ethernaut/15_NaughtCoin.md "b/Writeup/0xNezha/Ethernaut/15_NaughtCoin - \345\211\257\346\234\254.md" similarity index 100% rename from Writeup/0xNezha/Ethernaut/15_NaughtCoin.md rename to "Writeup/0xNezha/Ethernaut/15_NaughtCoin - \345\211\257\346\234\254.md" diff --git a/Writeup/0xNezha/Ethernaut/17_Recovery.md b/Writeup/0xNezha/Ethernaut/17_Recovery.md new file mode 100644 index 00000000..f72fac29 --- /dev/null +++ b/Writeup/0xNezha/Ethernaut/17_Recovery.md @@ -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, 过关。