Gatekeeper Three,我是你的破壁人。
根据Foundry 官方文档配置好运行环境后,于本项目下执行下列命令:
$ cd WTF-CTF
$ forge test -C src/Ethernaut/Gatekeeper_Three -vvvvv
-
对于gateOne,需要使用攻击合约调用
GatekeeperThree
合约,并且这个攻击合约地址还要是GatekeeperThree
合约的owner
。-
GatekeeperThree
合约在设置owner
时,将构造函数constructor
错误地写为了construct0r
。所以攻击合约需要调用一次construct0r
函数,成为owner
。GatekeeperThree(payable(gatekeeperThree)).construct0r();
-
-
对于gateTwo,需要将
GatekeeperThree
合约的allow_enterance
变量从false
转为true
。-
allow_enterance
变量只能在getAllowance
函数中调用trick
合约的checkPassword
函数成功返回true
时,才能修改为true
。而trick
合约的checkPassword
函数需要判断传入的_password
是否与合约存储的私有变量password
相同。可链上没有私有数据。通过读取
trick
合约内存插槽slot2
中存储的值,即可知道password
。uint256 _password = uint256(vm.load(address(GatekeeperThree(payable(gatekeeperThree)).trick()), bytes32(uint256(2))));
-
-
对于gateThree,需要给
GatekeeperThree
合约转大于0.001 ether
,并且我们的攻击合约在接收ETH
时需要失败。-
在调用
GatekeeperThree
合约的同时转移大于0.001 ether
,并且在攻击合约的receive
函数中无脑revert就好。receive() external payable { revert(); }
-