Eval me 1
Catégorie: Programmation Difficulté: - Flag: CTFREI{ea5y_pr0gramm1ng}
Challenge
Description
Arriveras-tu à passer toutes les étapes de ce programme ?
Il est conseillé d'utiliser pwntools
afin de résoudre ce challenge.
Connexion: nc vps.ctfrei.fr 5002
Ce challenge tourne sur un docker et n'est pas disponible
Solution
Le serveur nous envoie une série d'expressions mathématiques à résoudre, il faut donc créer un client TCP pour s'y connecter et y répondre en boucle.
Le challenge attend de nous que nous utilisions la fonction eval, ce que je déconseille impérativement (d'ailleurs la suite de ce challenge "Eval me 2" essaie de se jouer de ça pour nous tendre un piège)
Une recherche sur google permet de trouver des alternatives safe pour faire la même chose, comme cette réponse StackOverFlow (cimer chef)
import socket
import ast
import operator as op
# Evaluation safe d'une expression mathématiques
operators = {
ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul,
ast.Div: op.truediv, ast.Pow: op.pow, ast.BitXor: op.xor,
ast.USub: op.neg
}
def eval_expr(expr):
return eval_(ast.parse(expr, mode='eval').body)
def eval_(node):
match node:
case ast.Constant(value) if isinstance(value, int):
return value # integer
case ast.BinOp(left, op, right):
return operators[type(op)](eval_(left), eval_(right))
case ast.UnaryOp(op, operand): # e.g., -1
return operators[type(op)](eval_(operand))
case _:
raise TypeError(node)
# Connexion au serveur
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('vps.ctfrei.fr', 5002))
while True:
try:
# Récupération et affichage du message du serveur
data = client.recv(2048).strip().decode()
print(data)
# Récupération de l'expression à résoudre dans le message
expr = data.split('\n\n')[-1]
# Evaluation de l'expression
answer = eval_expr(expr)
# Envoie de la réponse
client.send(f"{answer}\n".encode())
except:
# Quitte la boucle si une exception est levée
break
Dernière mise à jour
Cet article vous a-t-il été utile ?