Just dig
Flag: HACKDAY{i_LovE_DiGg!N9_1nTo_4sm}
Challenge
Ce challenge tourne sur un docker et n'est pas disponible
Solution
Pour ce challenge, on commence par dรฉcompiler. Ici, j'utilise Ghidra.
Ensuite, rendez-vous dans la fonction HackDay
:

On voit un jump vers c95WsZt4xa
. Dans celui-ci, on place une valeur dans EBX, puis on jump ร nouveau.

Ce qu'on a mis dans EBX, c'est SEFD
, avec un peu d'intuition, on s'aperรงoit que c'est le dรฉbut de la base64 de HACKDAY :

En fait, le binaire place dans les registres EAX, EBX, ECX et EDX un bout du flag encodรฉ en base64. On peut ร la main rรฉcupรฉrer toutes ces valeurs dans le bon ordre, mais on va plutรดt automatiser รงa afin de montrer comment รงa fonctionne.
Ici, j'utilise python avec gdb :
import gdb
import re
from base64 import b64decode
def get_register_value(register: str) -> str:
s = gdb.execute(f"info register {register}", to_string=True)
s = re.sub(' +', ' ', s).split(' ')[1]
return s
def get_address_value(address: str) -> str:
s = gdb.execute(f"x /w {address}", to_string=True)
s = bytes.fromhex(s.split('\t')[1][2:]).decode()[::-1] # little endian
return s
# Charger le binaire
gdb.execute("file ./just-dig-out")
# On break sur le tout premier jump de HackDay (premier screen)
gdb.execute("break *0x565561e4")
# On lance le binaire
gdb.execute(f"run")
# Une fois le breakpoint atteint
# On rรฉcupรจre la valeur des registres
old_registers = [get_register_value(r) for r in ['eax', 'ebx', 'ecx', 'edx']]
# On prend le jmp suivant et on se cale APRES le MOV dans le registre
for i in range(2):
gdb.execute("ni")
encoded_flag = ''
for _ in range(11):
# Rรฉcupรจre les nouvelles valeurs des registres
registers = [get_register_value(r) for r in ['eax', 'ebx', 'ecx', 'edx']]
# Dรฉtecte le registre qui a changรฉ (et rรฉcupรจre l'adresse qu'il contient)
address = [registers[i] for i in range(len(registers)) if registers[i] != old_registers[i]][0]
# Rรฉcupรจre la valeur ร l'adresse
value = get_address_value(address)
# Ajoute cetete valeur ร notre chaรฎne finale
encoded_flag += value
# Remplace les anciens registres par les nouveaux
old_registers = registers
# Prendre le prochain jump
for i in range(4):
gdb.execute("ni")
# Dรฉcode et affiche le flag
print(b64decode(encoded_flag).decode())
gdb.execute("quit")
On lance la commande gdb -q -x just.py
, et on admire le travail :
[...]
0x56556219 <TF3D1xEH5f+0> mov eax, 0x565561c1
โ 0x5655621e <TF3D1xEH5f+5> inc DWORD PTR ds:0x56559008
0x56556224 <TF3D1xEH5f+11> cmp DWORD PTR ds:0x56559008, 0xc
0x5655622b <TF3D1xEH5f+18> je 0x56556365 <tWq5CYhW7B>
0x56556231 <qRHxrv9HwO+0> mov ebx, 0x5655618d
0x56556236 <qRHxrv9HwO+5> inc DWORD PTR ds:0x56559008
0x5655623c <qRHxrv9HwO+11> cmp DWORD PTR ds:0x56559008, 0x2
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ threads โโโโ
[#0] Id 1, Name: "just-dig-out", stopped 0x5655621e in TF3D1xEH5f (), reason: SINGLE STEP
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ trace โโโโ
[#0] 0x5655621e โ TF3D1xEH5f()
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
HACKDAY{i_LovE_DiGg!N9_1nTo_4sm}
Derniรจre mise ร jour
Cet article vous a-t-il รฉtรฉ utile ?