주어진 인스턴스의 소유권을 탈취하라.
'delegatecall' 이 어떻게 동작하는지 공부 ㄱㄱ
pragma solidity ^0.8.0;
contract Delegate {
address public owner;
constructor(address _owner) {
owner = _owner;
}
function pwn() public {
owner = msg.sender;
}
}
contract Delegation {
address public owner;
Delegate delegate;
constructor(address _delegateAddress) {
delegate = Delegate(_delegateAddress);
owner = msg.sender;
}
fallback() external {
(bool result,) = address(delegate).delegatecall(msg.data);
if (result) {
this;
}
}
}
delegatecall은 Solidity에서 외부 컨트랙트의 코드를 실행하되, 스토리지(storage)는 자신(this)의 것을 사용하는 저수준 함수입니다. -> 요약 : 코드는 빌리고, 저장소는 내 거 쓴다
delegatecall은 매우 위험한 함수입니다.
특히 fallback()에서 delegatecall(msg.data) 형태로 사용할 경우,
→ 공격자가 임의의 함수를 실행해 내 컨트랙트의 상태를 조작할 수 있음
fallback() external {
(bool result,) = address(delegate).delegatecall(msg.data);
if (result) {
this;
}
}
function pwn() public {
owner = msg.sender;
}