|
| 1 | +// SPDX-License-Identifier: MIT |
| 2 | +pragma solidity ^0.8.13; |
| 3 | +import "forge-std/Script.sol"; |
| 4 | +import "../src/chal_name/public/contracts/Setup.sol"; |
| 5 | +import "../src/chal_name/public/contracts/Exploit.sol"; |
| 6 | + |
| 7 | +bytes constant SIXTY_FOUR_ZEROS = "0000000000000000000000000000000000000000000000000000000000000000"; // ctrlc+v on handcrafted calldata |
| 8 | +address constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; |
| 9 | +/* |
| 10 | +Commands: |
| 11 | +# Testing command |
| 12 | +forge test --mp ./test/TestTemplate.t.sol --mc Tester --fork-url $ANVIL_URL -vvvvv |
| 13 | +
|
| 14 | +# Debug command |
| 15 | +forge test --mp ./test/TestTemplate.t.sol --mc Tester --debug <function> --fork-url $ANVIL_URL |
| 16 | +
|
| 17 | +# Script command |
| 18 | +forge script script/ScriptTemplate.s.sol:Scripter --rpc-url $ANVIL_URL --private-key $PRIVATE_KEY_1 --broadcast -vvvvv |
| 19 | +
|
| 20 | +# Debug broadcasted tx: |
| 21 | +cast run <TXHASH> -d --rpc-url $ANVIL_URL |
| 22 | +
|
| 23 | +# Exploratory |
| 24 | +forge inspect <path>:<ContractName> storage --pretty |
| 25 | +https://ethervm.io/decompile |
| 26 | +https://library.dedaub.com/decompile |
| 27 | +panoramix <bytecode> |
| 28 | +*/ |
| 29 | +contract Scripter is Script { |
| 30 | + |
| 31 | + Challenge challenge; |
| 32 | + address payable challengeAddress; |
| 33 | + address payable setupAddress; |
| 34 | + address payable exploitAddress; |
| 35 | + function setUp() public {} |
| 36 | + |
| 37 | + function run() external { |
| 38 | + vm.startBroadcast(); |
| 39 | + |
| 40 | + Setup setup = new Setup{value: 100 ether}(); |
| 41 | + setupAddress = payable(address(setup)); |
| 42 | + challenge = setup.challenge(); |
| 43 | + challengeAddress = payable(address(challenge)); |
| 44 | + |
| 45 | + Exploit exploit = new Exploit{value: 100 ether}(setup, challenge); |
| 46 | + exploitAddress = payable(address(exploit)); |
| 47 | + exploit.finalize(); |
| 48 | + |
| 49 | + // // alternatively use etk code as exploit |
| 50 | + // bytes memory etkCode = etkLoad(); |
| 51 | + // address _addr; |
| 52 | + // assembly { |
| 53 | + // _addr := create(0, add(initcode, 0x20), mload(initcode)) |
| 54 | + // } |
| 55 | + // exploitAddress = address(_addr); |
| 56 | + |
| 57 | + vm.stopBroadcast(); |
| 58 | + } |
| 59 | + |
| 60 | + |
| 61 | + function etkLoad() public returns (bytes memory etkCode){ |
| 62 | + // Helper function to load handcrafted EVM code from a file. |
| 63 | + // typically used as: |
| 64 | + // |
| 65 | + // bytes memory etkCode = etkLoad(); |
| 66 | + // vm.etch(someAddress, etkCode); |
| 67 | + // someAddress.call(hex"69696969"); |
| 68 | + |
| 69 | + string[] memory inputs = new string[](2); |
| 70 | + // /** |
| 71 | + // * windows: scripts/compile.bat |
| 72 | + // * linux : scripts/compile.sh |
| 73 | + // */ |
| 74 | + inputs[0] = "./script/compile.sh"; |
| 75 | + |
| 76 | + // // path/to/contract.etk |
| 77 | + inputs[1] = "./src/chal_name/public/contracts/exploit.etk"; |
| 78 | + |
| 79 | + etkCode = vm.ffi(inputs); |
| 80 | + } |
| 81 | + |
| 82 | +} |
0 commit comments