15.Naught Coin
2023-06-23 20:21:59 # 04.Ethernaut CTF

Naught Coin

题目

目标:将player(即我们的钱包用户)的token全部转出去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import 'openzeppelin-contracts-08/token/ERC20/ERC20.sol';

contract NaughtCoin is ERC20 {

// string public constant name = 'NaughtCoin';
// string public constant symbol = '0x0';
// uint public constant decimals = 18;
uint public timeLock = block.timestamp + 10 * 365 days;
uint256 public INITIAL_SUPPLY;
address public player;

constructor(address _player)
ERC20('NaughtCoin', '0x0') {
player = _player;
INITIAL_SUPPLY = 1000000 * (10**uint256(decimals()));
// _totalSupply = INITIAL_SUPPLY;
// _balances[player] = INITIAL_SUPPLY;
_mint(player, INITIAL_SUPPLY);
emit Transfer(address(0), player, INITIAL_SUPPLY);
}

function transfer(address _to, uint256 _value) override public lockTokens returns(bool) {
super.transfer(_to, _value);
}

// Prevent the initial owner from transferring tokens until the timelock has passed
modifier lockTokens() {
if (msg.sender == player) {
require(block.timestamp > timeLock);
_;
} else {
_;
}
}
}

分析

本道题是考察我们对ERC20标准的认识。

本题实现ERC20标准,发行了一些代币,这些代币全部给到了我们的钱包地址,实现了一个方法transfer(address,_to, uint256 _value),然后修饰器lockTokens限制了它:只能在10年之后才可以调用transfer方法转出去代币。当然我们不能等这么久,得想办法绕过去。

我们知道,ERC20标准有两个转账函数:transfer和transferFrom。本题中只override和限制了transfer,那么我们是可以通过transferFrom来进行转账的。对于transferFrom:转账之前需要进行授权,授权给一个代理人,允许他转出我们一个金额,当然这个代理人可以是我们自己。

因此,我们只需要approve自己,然后自己再调用transferFrom函数即可转出代币

本题是只重写和限制了transfer而没有对transferFrom进行处理,因此可以这么解题

做题

获取实例,做题

通过