
# 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 لاستخدامه في واجهات برمجة التطبيقات مثل: app.launchURL، document.submitForm أو app.media.createPlayer، إذا كان baseURL يبدو كسلسلة UTF-16BE، فإن السلسلة النسبية تُعامل أيضاً كسلسلة UTF-16BE عند إجراء التسلسل، على الرغم من أنها في الواقع سلسلة ANSI.
قد يؤدي هذا من ناحية إلى وصول قراءة خارج الحدود. ومن ناحية أخرى، عند تخصيص الذاكرة لاحتواء المخزن المؤقت الوجهة، يتم "قياس" عنوان URL النسبي كسلسلة ANSI. وهذا بالطبع غير كافٍ إذا حدثت قراءة خارج الحدود (السلسلة + فاصل NULL تملآن كتلة كومة كاملة).
ماذا يعني هذا؟
سيؤدي هذا في أغلب الأحيان إلى تعطل، وأحياناً إلى الكتابة فوق byteLength لكائن ArrayBuffer لتُصبح 0xFF.
إذا كانت لديك أسئلة، فلا تتردد في التواصل معي على تويتر: https://twitter.com/Zeusb0x
سيتضمن كتالوج مستند PDF إدخال URI يحمل مرجعاً غير مباشر إلى كائن قاموس. وسيحتوي هذا الأخير بدوره على إدخال Base، وهو baseURL الفعلي. وسيكون غالباً موجوداً بترميز ست عشري ويبدأ بالحرفين \xFE\xFF. (انظر PoC). لحسن الحظ، هذه هي الطريقة الوحيدة لتغيير baseURL لمستند في سياق عادي غير متميز. فمحاولة القيام بذلك من JavaScript ستؤدي إلى استثناء أمني.