Skip to content

Latest commit

 

History

History
337 lines (247 loc) · 11.2 KB

Location.md

File metadata and controls

337 lines (247 loc) · 11.2 KB

This challenge was quite unique, a quiz on storage slot's in solidity. we are given a nc address to interact with and it imediately prompts us the first question in a random order. There where 11 different questions , we are to find the storage slot where password is stored. To automate this challenges a bit i made a contract on remix with each chall and assigned correct values to it's variables. And for each of the contracts i made a function

 function getStorageSlotPassword() external view returns (uint _slot){
        assembly{
            //return 0
            _slot:= password.slot
        }
    }

full detailed solution (TL;DR)

/ SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;



contract StorageChallenge10 {
    bool private string_true;
    bool private number_false;
    bool private user_true;
    bytes32 private username;
    bytes32 private password;
    bool public status_creds;

    constructor(bool _string,bool _number,bool _user,bytes32 _username,bytes32 _passwd){
        string_true = _string;
        number_false = _number;
        user_true = _user;
        username = _username;
        password = _passwd;
    }

    function getStorageSlotPassword() external view returns (uint _slot){
        assembly{
            //return 0
            _slot:= password.slot
        }
    }

    //slot = 2




}



contract StorageChallenge2 {
    address[2] private investor ;
    uint64 private password = 45;
    bytes32 private user = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;
    address private owner = 0x01CAe69eC24493327A08FaAE459f5251f83d8847;

    constructor(address investor1, address investor2) {
        investor[0] = investor1;
        investor[1] = investor2;
    }

     function getStorageSlotPassword() external view returns (uint _slot){
        assembly{
            //return 0
            _slot:= password.slot
        }
    }

    //password storage slot = 2

}


contract StorageChallenge5 {
    address[2] private investor;
    bytes32 private user = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;
    address private owner = 0x01CAe69eC24493327A08FaAE459f5251f83d8847;
    uint64 private password = 65;

    constructor(address investor1, address investor2) {
        investor[0] = investor1;
        investor[1] = investor2;
    }

    function getStorageSlotPassword() external view returns (uint _slot){
        assembly{
            //return 0
            _slot:= password.slot
        }
    }

}

contract StorageChallenge7 {
    bytes32 private key = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;
    bytes4 private key_1 = 0x95c8029d;
    bytes16 private key_2 = 0xf07b7fc0b6845e34a4b8a7f3a83ed68f;
    address private owner = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
    uint256 private Token = 87;
    address private immutable Investor = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
    address private Courier = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
    bytes32 private immutable password = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;

    function getStorageSlotPassword() external view returns (uint _slot){
        assembly{
            //return 0
            _slot:= password.slot
        }
    }

    function getImmutableValueStorageSlot() public view returns (uint256) {
        return type(StorageChallenge7).slot("myImmutableValue");
    }




    
}

contract StorageChallenge3 {
    address private owner = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
    uint64 private password = 34;
    bytes32 private user = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;
    address[2] private investor;

    function getStorageSlotPassword() external view returns (uint _slot){
        assembly{
            //return 0
            _slot:= password.slot
        }
    }



}

contract StorageChallenge1 {
    bytes32 private user = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;
    address[2] private investor;
    uint64 private password = 34;
    address private owner = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;

    constructor(address investor1, address investor2) {
        investor[0] = investor1;
        investor[1] = investor2;
    }

    function getStorageSlotPassword() external view returns (uint _slot){
        assembly{
            //return 0
            _slot:= password.slot
        }
    }




}

contract StorageChallenge8 {
    bytes32 private key = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;
    bytes4 private key_1 = 0x95c8029d;
    bytes16 private key_2 = 0xf07b7fc0b6845e34a4b8a7f3a83ed68f;
    address private owner = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
    uint256 private Token = 106;
    address private immutable Investor = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
    address private Courier = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
    uint256 private lump_sum = 56;
    bytes32 private password = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;

    function getStorageSlotPassword() external view returns (uint _slot){
        assembly{
            //return 0
            _slot:= password.slot
        }
    }
}



contract StorageChallenge6 {
    bytes32 immutable passphrase = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;
    uint64 private password = 89;
    bytes32 private user = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;
    address[2] private investor;
    address private owner = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;


    function getStorageSlotPassword() external view returns (uint _slot){
        assembly{
            //return 0
            _slot:= password.slot
        }
    }

}

contract StorageChallenge9 {
    bytes32 private unique_code = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;
    bytes32 private key_12 = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;
    address private owner = 0xd2a5bC10698FD955D1Fe6cb468a17809A08fd005;
    address[20] public player;
    bool private valid = true;
    bytes32 private password = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;
    address private enemy = 0xd2a5bC10698FD955D1Fe6cb468a17809A08fd005;
    bool private answered = false;

      constructor() {
        player[0] = address(0x1234567890123456789012345678901234567890);
        player[1] = address(0x9876543210987654321098765432109876543210);
        player[2] = address(0xd2a5bC10698FD955D1Fe6cb468a17809A08fd005);
        player[3] = address(0xd2a5bC10698FD955D1Fe6cb468a17809A08fd005);
        player[4] = address(0x5555555555555555555555555555555555555555);
        player[5] = address(0x7777777777777777777777777777777777777777);
        player[6] = address(0x8888888888888888888888888888888888888888);
        player[7] = address(0x9999999999999999999999999999999999999999);
        player[8] = address(0xd2a5bC10698FD955D1Fe6cb468a17809A08fd005);
        player[9] = address(0xd2a5bC10698FD955D1Fe6cb468a17809A08fd005);
        player[10] = address(0xd2a5bC10698FD955D1Fe6cb468a17809A08fd005);
        player[11] = address(0xd2a5bC10698FD955D1Fe6cb468a17809A08fd005);
        player[12] = address(0xd2a5bC10698FD955D1Fe6cb468a17809A08fd005);
        player[13] = address(0x1111111111111111111111111111111111111111);
        player[14] = address(0x2222222222222222222222222222222222222222);
        player[15] = address(0x3333333333333333333333333333333333333333);
        player[16] = address(0x4444444444444444444444444444444444444444);
        player[17] = address(0x5555555555555555555555555555555555555555);
        player[18] = address(0x6666666666666666666666666666666666666666);
        player[19] = address(0x7777777777777777777777777777777777777777);
    }

    function getStorageSlotPassword() external view returns (uint _slot){
        assembly{
            //return 0
            _slot:= password.slot
        }
    }

}

contract StorageChallenge4 {
    uint64 private password = 65 ;
    bytes32 private user = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;
    address[2] private investor;
    bytes32 immutable  passphrase = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;
    address private owner = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;

    function getStorageSlotPassword() external view returns (uint _slot){
        assembly{
            //return 0
            _slot:= password.slot
        }
    }
}

contract Hell_0 {
    uint256 private avail_money = 1000;
    uint256 private saved_money = 1009;
    bool private not_minus = true;
    address private owner = 0x3328358128832A260C76A4141e19E2A943CD4B6D;
    uint256[2] private geo_loc;
    bool private is_there = false;
    bool private there = true;
    address private wallet = 0x3328358128832A260C76A4141e19E2A943CD4B6D;
    address private receiver = 0x3328358128832A260C76A4141e19E2A943CD4B6D;
    address[20] private transaction_list;
    bytes32 private user_creds = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;
    uint256 private immutable user_in_uint = 790;
    bytes32 private password = 0x95c8029d0e4c511b8c3a51952d6f1e0f979f7528876d101d4208980133998a04;
    uint256 private password_uint = 56;
    bool private correct_password = true;
    bool private is_user = false;



    constructor() {
        transaction_list[0] = address(0x1234567890123456789012345678901234567890);
        transaction_list[1] = address(0x9876543210987654321098765432109876543210);
        transaction_list[2] = address(0x9876543210987654321098765432109876543210);
        transaction_list[3] = address(0x9876543210987654321098765432109876543210);
        transaction_list[4] = address(0x5555555555555555555555555555555555555555);
        transaction_list[5] = address(0x7777777777777777777777777777777777777777);
        transaction_list[6] = address(0x8888888888888888888888888888888888888888);
        transaction_list[7] = address(0x9999999999999999999999999999999999999999);
        transaction_list[8] = address(0x9876543210987654321098765432109876543210);
        transaction_list[9] = address(0x9876543210987654321098765432109876543210);
        transaction_list[10] = address(0x9876543210987654321098765432109876543210);
        transaction_list[11] = address(0x9876543210987654321098765432109876543210);
        transaction_list[12] = address(0x9876543210987654321098765432109876543210);
        transaction_list[13] = address(0x1111111111111111111111111111111111111111);
        transaction_list[14] = address(0x2222222222222222222222222222222222222222);
        transaction_list[15] = address(0x3333333333333333333333333333333333333333);
        transaction_list[16] = address(0x4444444444444444444444444444444444444444);
        transaction_list[17] = address(0x5555555555555555555555555555555555555555);
        transaction_list[18] = address(0x6666666666666666666666666666666666666666);
        transaction_list[19] = address(0x7777777777777777777777777777777777777777);

        geo_loc[0] = 6;
        geo_loc[1] = 78;
    }

    function getStorageSlotPassword() external view returns (uint _slot){
        assembly{
            //return 0
            _slot:= password.slot
        }
    }
}

pretty ugly solve but "if it works, it works " - voxelbugged(captain pwnverse crew)

The flag was: TCP1P{W00t_w00t_t0_th3_p4rty_47JHbddc}