Ethernaut: 16. 보존
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract Preservation {
// public library contracts
address public timeZone1Library;
address public timeZone2Library;
address public owner;
uint storedTime;
// Sets the function signature for delegatecall
bytes4 constant setTimeSignature = bytes4(keccak256("setTime(uint256)"));
constructor(address _timeZone1LibraryAddress, address _timeZone2LibraryAddress) public {
timeZone1Library = _timeZone1LibraryAddress;
timeZone2Library = _timeZone2LibraryAddress;
owner = msg.sender;
}
// set the time for timezone 1
function setFirstTime(uint _timeStamp) public {
timeZone1Library.delegatecall(abi.encodePacked(setTimeSignature, _timeStamp));
}
// set the time for timezone 2
function setSecondTime(uint _timeStamp) public {
timeZone2Library.delegatecall(abi.encodePacked(setTimeSignature, _timeStamp));
}
}
// Simple library contract to set the time
contract LibraryContract {
// stores a timestamp
uint storedTime;
function setTime(uint _time) public {
storedTime = _time;
}
}
여기서 우리는 전능자의 손 안에 있습니다
delegatecall
. 주어진 계약은 실제로 6단계(위임)에서 익스플로잇으로 사용한 버그로 인해 어려움을 겪고 있습니다. setFirstTime
를 호출하면 실제로 timeZone1Library
저장 변수의 값을 덮어씁니다! 우리가 하는 일은 다음과 같습니다.setTime(uint256)
인 기능이 있는 계약을 만듭니다. 이 계약에는 호출자의 컨텍스트에서 변수를 덮어쓸 수 있도록owner
충분한 스토리지 변수가 있어야 합니다. timeZone1Library
주소를 setFirstTime(<your contract address>)
를 통해 이 계약의 주소로 설정합니다. setFirstTime(<whatever>)
를 다시 호출하여 사용자 정의 함수를 실행하십시오. 저자의 메시지를 인용하여 이 수준에서 좋은 시사점을 얻습니다.
Reference
이 문제에 관하여(Ethernaut: 16. 보존), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/erhant/ethernaut-16-preservation-1fo8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)