# Just dig

**Flag:** HACKDAY{i\_LovE\_DiGg!N9\_1nTo\_4sm}

## Challenge

{% file src="https://2344605990-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5vTwbgJFy6k3bN4a9ntp%2Fuploads%2FqjqUn1WwzUdiUDJCzRv5%2Fjust-dig.zip?alt=media&token=bbfd541f-9d21-4e83-b681-1d0f6c802038" %}

{% hint style="info" %}
**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
{% endhint %}

{% hint style="warning" %}
Ce challenge tourne sur un docker et n'est pas disponible
{% endhint %}

## Solution

Pour ce challenge, on commence par décompiler. Ici, j'utilise **Ghidra**.

Ensuite, rendez-vous dans la fonction **`HackDay`** :

<figure><img src="https://2344605990-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5vTwbgJFy6k3bN4a9ntp%2Fuploads%2Fwj8PAPSRml8PwbEs7ggu%2Fimage.png?alt=media&#x26;token=f3b199c2-e862-4211-b8b7-37d5c2ed326d" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://2344605990-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5vTwbgJFy6k3bN4a9ntp%2Fuploads%2FDztAkfKwAos4feVjvGqP%2Fimage.png?alt=media&#x26;token=496dc189-ba06-456f-b0b5-21d7361e6c97" alt=""><figcaption></figcaption></figure>

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 :

<figure><img src="https://2344605990-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5vTwbgJFy6k3bN4a9ntp%2Fuploads%2FVQit6hVeYwBB6YtZH7yU%2Fimage.png?alt=media&#x26;token=0bb98fab-3fe3-4982-b5ea-858213e79d8e" alt=""><figcaption></figcaption></figure>

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 :

```python
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 :

<pre><code><strong>[...]
</strong><strong>
</strong><strong>   0x56556219 &#x3C;TF3D1xEH5f+0>   mov    eax, 0x565561c1
</strong> → 0x5655621e &#x3C;TF3D1xEH5f+5>   inc    DWORD PTR ds:0x56559008
   0x56556224 &#x3C;TF3D1xEH5f+11>  cmp    DWORD PTR ds:0x56559008, 0xc
   0x5655622b &#x3C;TF3D1xEH5f+18>  je     0x56556365 &#x3C;tWq5CYhW7B>
   0x56556231 &#x3C;qRHxrv9HwO+0>   mov    ebx, 0x5655618d
   0x56556236 &#x3C;qRHxrv9HwO+5>   inc    DWORD PTR ds:0x56559008
   0x5655623c &#x3C;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}
</code></pre>
