Agent, nous avons découvert un smart contract de Hallebarde qui permet d’obtenir de l’argent gratuitement. Il sert également à s’authentifier en tant que nouveau membre de Hallebarde. Nous voulons que vous vous fassiez passer pour un de leurs membres. Nous avons récemment trouvé un endpoint qui semble leur servir de portail de connexion. Introduisez-vous dans leur système et récupérez toutes les informations sensibles que vous pourrez trouver.
- Contrat à l’adresse :
0xb8c77090221FDF55e68EA1CB5588D812fB9f77D6- Réseau de test Ropsten
-
Après une analyse du code et notamment la non-utilistion de la libraire SafeMath, ce qui nous met la puce à l’oreille on observe une possibilité d’Overflow dans la fonction
transfer. En effet, lors de la soustraction du montant, le programme ne vérifie pas si l’on possède le montant minimum mais seulement si notre argent n’est pas nul. -
Ainsi en effectuant
getMoney(n), puistransfer(m)avec m>n, on obtient un underflow et une somme d’argent énorme ce qui nous permet de passer la première condition deEnterHallebarde() -
La seconde condition pose elle un peu plus de problèmes puisqu’elle cherche à vérifier tx.origin != msg.sender. En solidity
tx.origincorrespond à la racine de la transaction la oùmsg.senderest l’adresse directe de la requête (en résumé). Ainsi, pour quetx.originsoit différent demsg.sender, il faut passer par un contrat intermédiaire qu’on appellera et qui fera ensuite lui les appels au contrat du chall. On aura alorsmsg.sender= l’adresse du contrat intermédiaire ettx.origin= l’adresse de l’user avec lequel on appelle le contrat intermédiaire. -
On transcrit alors les opérations à faire dans le fichier
YesBabe.solqu’on deploy ensuite sur le réseau Ropsten grâce à Remix. -
On fait ensuite les appels au contrat et on rentre l’adresse sur laquelle est déployé le contrat dans le netcat :
| 404CTF{5M4r7_C0N7r4C7_1NC3P710N_37_UND3rF10W_QU01_D3_P1U5_F4C113} |
|———————————————————————|