Vous avez déjà du voir que je n'aime pas le web3 (d'autant plus quand un challenge se base
sur le fait qu'il soit difficile de trouver la clef publique d'un compte!)
donc, ne vous étonnez pas du nom de mes fichiers ou de mes variables!
Le challenge a été redéployé pendant le CTF, il se peut donc que les screens de ce writeup présentent
des adresses variables
Etherscan
Encore une fois, on va démarrer dans etherscan
Dans le code de création du contrat, on trouve une "adresse secrète"
On peut facilement savoir qu'elle fait partie du CTF au vu d'une de ses transactions
Mais ceci n'est pas le flag du challent! Ce n'est pas une clef publique
On regarde alors avec combien d'adresses le vieux contrat a interagit: on en trouve 3
On cherche qui a créé le nouveau contrat et on trouve une adresse
On remonte jusqu'à l'adresse secrète, dont on trouve une transaction
NodeJS
On va alors passer par NodeJS pour récupérer les informations de cette transaction,
signée, et la clef publique associée
On configure infura comme notre "provider" pour accéder à la blockchain depuis NodeJS
Alors, il faudra m'expliquer comment le web3 peut être "décentralisé" s'il faut un provider
pour accéder à la blockchain. En fait, non, m'expliquez pas: je m'en fous :D
On récupère cette clef
Et, nope, fail! ce n'est pas la public key
A la mano
Je pars donc sur une construction de la clef à la main, et je récupère la transaction en RAW
A partir de cette RAW transaction, le site ABDKToolkit me donne le détail,
avec la public key (compressée ou non) et l'adresse (celle "secrète")
Ignorer un byte
Si on ignore le 1er byte de la clef publique décompressée (0x04) alors la fin de son Keccak-256
correspond à l'adresse secrète
En fait, la clef publique commence pas 0x03 si elle est au format compressé,
et par 0x04 si elle est décompressée. Or, c'est la clef publique décompressée elle-même
dont on a besoin, d'où le fait d'ignorer ce premier caractère.
On essaie et… ca passe!
Flag: 404CTF{0xb227feb5ecb369faf668f711f2331d163244fddb5e297be94fe30046b261732fda92d1afe5578f1d88c29ae439a7220ecc984701411742b5fec2b1639433100d}
Oui, j'avais franchement été saoulé par ce challenge et la complexité bordelique pour une information
aussi simple qu'une clef publique (la "documentation" totalement inconsistante
et basée sur les bruits de couloirs du net et la spéculation des gens sur StackOverflow n'a pas aidé)