L'objectif de ce challenge est de déverrouiller le vault
Le contrat est très simple, pour pouvoir le déverrouiller, il faut appeler la méthode unlock
en lui donnant le bon mot de passe.
Le bon mot de passe est un membre private
du contrat
Le mot clé private
signifie seulement que la variable est seulement visible du contrat qui la définit.
Mais il est possible de lire le contenu de la variable.
Les membres des contract sont stockés dans des slots dont le premier index est 0
Dans le cas du contrat Vault
, nous avons le membre locked
qui est socké dans le slot d'index 0 et le membre password
dans le slot d'index 1
En lisant la valeur stocké dans le slot d'index 1, nous récupérons le mot de passe:
read_password = web3.eth.get_storage_at(vault.address, 1)
Afin de pouvoir agir sur la chaine rinkeby
, il est nécessaire de créer un fichier .env
contenant la clé de projet Infura et la valeur de la clé privée du compte utilisé pour le challenge:
export WEB3_INFURA_PROJECT_ID='AABBCCDD.......'
export PRIVATE_KEY='0xDEADBEEFCACA...'
En utilisant la console sur le site d'ethernaut openzeppelin on récupère l'adresse du contrat déployé pour lancer l'attaque ainsi:
$ brownie run scripts/unlock.py main "0xDe765054224062E20ea0bf282696984d685B9704" --network rinkeby
Brownie v1.18.1 - Python development framework for Ethereum
VaultProject is the active project.
Running 'scripts/unlock.py::main'...
Locked: True
Transaction sent: 0xcbd474af778d212430e17bb9d68a1e93995d1619cbb59155d62be70ce096a073
Gas price: 1.000000014 gwei Gas limit: 31896 Nonce: 237
Transaction confirmed Block: 10464941 Gas used: 24197 (75.86%)
Locked: False