Just dig

Flag: HACKDAY{i_LovE_DiGg!N9_1nTo_4sm}

Challenge

Description


Researchers have recently uncovered a mysterious ancient artifact beneath the Cogswell Halls. Its purpose remains unknown, but its potential seems invaluable. Who knows? The secrets it holds could revolutionize modern knowledge. They need an expert eyeโ€”yours! Let's dig in !


sha256: 966a1f6b87a7c29df32838da5afeead32c5141603faba59b4373c98bcd67b5d9

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 ?