지금 상금보다 많은 ether를 넣으면 새로운 왕이 되는 게임이다. 그런데 instance를 제출하면 level이 king을 가져갈 것이다. 그것을 피해서 왕이 되어야 한다. 그리고 자기 자신이 받으면 안 된다.
문제 컨트랙트에서 recevie()함수를 보면 prize보다 msg.value가 크거나 msg.sender가 owner여야 하는데 Onwer조건은 통과할 수 없어서 prize보다 많은 수량을 보내야 한다. prize변수를 찾아보면 1000000000000000이라고 되어 있으니 저것보다 많은 Eth를 날리면 된다.
function sendEthKin() external payable {
(bool sent, )= king.call{value: msg.value}("");
require(sent);
}
문제의 King컨트랙트 주소에 call함수를 사용해서 날리면 owner가 Attack컨트랙트가 된다.
level 9.King 코드
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract King {
address king;
uint public prize;
address public owner;
constructor() payable {
owner = msg.sender;
king = msg.sender;
prize = msg.value;
}
receive() external payable {
require(msg.value >= prize || msg.sender == owner);
payable(king).transfer(msg.value);
king = msg.sender;
prize = msg.value;
}
function _king() public view returns (address) {
return king;
}
}
'CTF > Ethernaut' 카테고리의 다른 글
[Ethernaut] 11.Elevator (0) | 2024.02.08 |
---|---|
[Ethernaut] 10.Re-entrancy (0) | 2024.02.05 |
[Ethernaut] 8.Vault (0) | 2024.02.01 |
[Ethernaut] 7.Force (0) | 2024.02.01 |
[Ethernaut] 6.Delegation (2) | 2024.01.31 |