Lucky Faucet

Catégorie: Blockchain Difficulté: easy Flag: HTB{1_f0rg0r_s0m3_U}

Challenge

file-archive
1KB
circle-info

Description


The Fray announced the placement of a faucet along the path for adventurers who can overcome the initial challenges. It's designed to provide enough resources for all players, with the hope that someone won't monopolize it, leaving none for others.

circle-exclamation

Analyse du code

Le contrat LuckyFaucet créé possède 500 ether au départ. L’objectif et de lui en faire perdre au moins 10

Setup.sol

function isSolved() public view returns (bool) {
  return address(TARGET).balance <= INITIAL_BALANCE - 10 ether;
}

Pour cela, on peut utiliser la fonction sendRandomETH qui permet d’envoyer à celui qui l’appel une somme entre 50 000 000 et 100 000 000 wei, ce qui fait maximum 0,0000000001 ETH

Autant dire qu’il va falloir appeler une tonne de fois cette fonction.

LuckyFaucet.sol

Seullement nous pouvons redéfinir les bornes lowerBound et upperBound avec la fonction setBounds

Par contre, ces valeurs ne peuvent dépasser 100 000 000 de wei

La vulnérabilité réside dans le fait que lowerBound et upperBound sont définis en tant qu’int64 alors que la somme envoyée est un uint64

Autrement dit, si le nombre casté en uint64 est négatif, alors il se transformera en position. C’est ce qu’on appelle une vulnérabilité Underflow.

En choisissant des bornes -[-1, -1] le nombre aléatoire, qui est replacé entre les bornes, deviendra forcément -1 . Ainsi lors du cast en uint64 ce -1 se transformera en 18 446 744 073 709 551 615

La somme envoyée sera alors d’environ 18 ETH, soit suffisamment pour remplir la condition de isSolved


Script de résolution

Mis à jour