
# IA32 plugin, ver. 2020.013.20074.
char * __cdecl FUN_2581894c(char *base_url,LPCSTR rel_url)
{
............................................................
............................................................
if ((base_url != (char *)0x0) && (rel_url != (LPCSTR)0x0)) {
if ((*base_url == -2) && (base_url[1] == -1)) {
iVar6 = bytes_len(base_url);
pcVar7 = base_url + iVar6;
pcVar8 = rel_url + 2;
do {
do {
cVar3 = *pcVar8;
pcVar1 = pcVar8 + 2;
*pcVar7 = cVar3;
pcVar2 = pcVar7 + 2;
cVar4 = pcVar8[1];
pcVar7[1] = cVar4;
pcVar7 = pcVar2;
pcVar8 = pcVar1;
} while (cVar3 != '\0');
} while (cVar4 != '\0');
}
else {
lstrcatA(base_url,rel_url);
}
return base_url;
}
.............................................................
.............................................................
}
При построении абсолютного URL из относительного на основе baseURL PDF-документа для использования в таких API, как: app.launchURL, document.submitForm или app.media.createPlayer,
если baseURL выглядит как строка UTF-16BE, то при конкатенации относительная строка также обрабатывается как UTF-16BE, хотя на самом деле это ANSI-строка.
С одной стороны, это может привести к чтению за пределами буфера (Out-of-bounds read). С другой стороны, при выделении памяти под буфер назначения относительный URL «измеряется» как ANSI-строка. Этого, конечно, недостаточно, если происходит чтение за пределами границ (строка + NULL-терминатор заполняют целый heap-чанк).
Что это означает?
Чаще всего это приводит к сбою, а иногда — к перезаписи byteLength объекта ArrayBuffer значением 0xFF.
Если есть вопросы, смело обращайтесь ко мне в Twitter: https://twitter.com/Zeusb0x
В каталоге PDF-документа будет запись URI, содержащая косвенную ссылку на объект-словарь. В нём, в свою очередь, будет запись Base, которая и является фактическим baseURL. Скорее всего, он будет представлен в шестнадцатеричном виде и будет начинаться с символов \xFE\xFF (см. PoC). К счастью, это единственный способ изменить baseURL документа в обычном, непривилегированном контексте. Попытка сделать это из JavaScript вызовет исключение безопасности.