Ethernaut: 8. 금고
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract Vault {
bool public locked;
bytes32 private password;
constructor(bytes32 _password) public {
locked = true;
password = _password;
}
function unlock(bytes32 _password) public {
if (password == _password) {
locked = false;
}
}
}
여기서 우리는 황금률을 기억합니다: 블록체인의 모든 것은 모든 사람이 볼 수 있도록 거기에 있으며 항상 거기에 있을 것입니다. 이로써 계약서 작성에 사용된 비밀번호를 알 수 있습니다. 실제로 두 가지 방법이 있습니다.
컨트랙트 생성 트랜잭션을 보고 비밀번호 찾기: 컨트랙트 생성 코드는 컨트랙트 ABI 인코딩과 파라미터로 구성되어 있습니다. 따라서 마지막에 표시되는 일부 숫자는
constructor
인수입니다. 하나의 인수만 있다는 것을 알고 있습니다: 암호(32바이트). 16진수로는 64자이므로 계약 생성 코드의 마지막 64자를 확인할 수 있으며 이것이 비밀번호입니다. unlock
함수를 호출하는 동안 문자열 시작 부분에 0x
를 추가해야 합니다.저장소 변수를 보고 암호 찾기: Vault 계약을 보면 저장소를 위에서 아래로 읽습니다. EVM에는 각각 32바이트 값이 저장된
2 ^ 256}
개의 슬롯이 있습니다. 맨 위에는 bool public locked
가 있고 그 다음에는 bytes32 private password;
가 있습니다. 이 변수는 스토리지에서 각각 인덱스 0과 1에 있습니다. 따라서 다음을 통해 비밀번호를 읽을 수 있습니다.await web3.eth.getStorageAt(contract.address, 1)
contract.unlock(...)
에 매개변수로 결과를 제공하기만 하면 됩니다.
Reference
이 문제에 관하여(Ethernaut: 8. 금고), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/erhant/ethernaut-8-vault-52h0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)