⭐Revers(ibl)e Engineering [2/2]
404CTF{4df8110da3b4c5c1e87e564418fab97f}
Challenge
Préparation
import socket
import os
from io import BytesIO
from zipfile import ZipFile
import typing
HOST = 'challenges.404ctf.fr'
PORT_BINARY = 31990
PORT_SOLVE = 31991
class Binary:
FOLDER = 'out'
# Sauvegarde de toutes les instances de binaires téléchargés
INSTANCES: typing.Dict['str', 'Binary'] = {}
@staticmethod
def fetch() -> 'Binary':
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT_BINARY))
archive = b''
while True:
data = client.recv(4096)
if len(data) == 0:
break
archive += data
archive = ZipFile(BytesIO(archive))
crackme = archive.read('crackme.bin')
token = archive.read('token.txt').decode()
return Binary(crackme, token)
def __init__(self, crackme: bytes, token: str) -> None:
self.crackme = crackme
self.token = token
self.filename = f'crackme_{self.token}.bin'
self.filepath = os.path.join(self.FOLDER, self.filename)
# Récupération des données envoyées par le serveur
self.responses = self.get_server_data()
# Ajout de notre objet à la liste des instances existances
self.INSTANCES[self.token] = self
self.save()
def save(self):
if not os.path.exists(self.FOLDER):
os.mkdir(self.FOLDER)
with open(self.filepath, 'wb') as f:
f.write(self.crackme)
os.system(f'chmod +x {self.filepath}')
def get_server_data(self):
# A compléter
pass
def solve(self):
# A compléter
passAnalyse des binaires reçus
main
recv_functions
connect_and_send_token
recv_function
recv_key_and_message
read_password
verify
apply_functions
encrypt
Compréhension et stratégie

Résolution
Redirection des flux
Récupération des données
Serveur local
GDBScript et solve
Script complet
Mis à jour