Vault(123456789)를 넣으면 password = _password 로 설정 된다.
그리고 User는 {id: 0, password: 123456789}가 된다.
코드를 보면 load(address _address, bytes32, slot);로 adress의 slot를 return한다.
vm.load(address(VaultContract), VaultContract.getArrayLocation(1,1,1));는 slot = 1, index = 1, elementSize = 2로 slot는 1의 2번째 인자를 추출하는 것이다. 그러면 slot1은 user이고 element의 2번째 인자는 password이다. 그래서 똑같이 123456789가 나온다.
이 문제는 Storage문제로 아무리 private로 변수를 지정해놨어도 Storage에 들어가는 값은 slot에 저장되어 진다.
따라서 solidity의 getStorageAt(address, index)를 사용하면 해당 slot의 값을 확인할 수 있다.
Vulnerability
uint256 private password;
exploit
bytes32 user = vm.load(address(VaultContract), VaultContract.getArrayLocation(1,1,1));