ASI SAMP 0.3.7 MultiRCE Fix (Menu, GameText & Animation)

Dark_Knight

Me, me and me.
Друг
4,075
2,091

TheClaudePlay

Известный
186
37
SAMP 0.3.7 MultiRCE Fix
Данный плагин исправляет несколько уязвимостей переполнения буффера, которые могут привести к RCE:
с меню, GameText и анимациями.


Поддерживаемые версии: SA-MP 0.3-DL R1, 0.3.7 R1, R3-1, R4, R5.
Краткое описание уязвимостей:
Уязвимость с меню: в общем исправлена в SA-MP 0.3.7-R4 (однако остаётся возможность повредить кучу с помощью ID меню выше 127). Заключается в переполнении буффера кучи (heap buffer overflow) в объекте CMenu (причиной этому служит отсутствие валидации количества строчек в меню), а также, что более важно, - в возможности записывания строчек в CMenu без нулевого байта на конце, что может привести к переполнению буффера на стэке (stack buffer overflow) в функции CFont::ProcessCurrentString (для этого в строчку нужно вставить тэг форматирования GTA).
Уязвимость с GameText: частично исправлена в SA-MP 0.3.7-R5, однако при правильном подборе входных данных всё ещё возможно её использование. Заключается в переполнении статического буффера (static buffer overflow) около массива CMessages::BIGMessages (причиной этому служит неправильная валидация стиля GameText).
Уязвимость с анимациями: официально не исправлена, заключается в различии размеров буфферов на стэке между SAMP и GTA: SA, что приводит к переполнению буффера на стэке (stack buffer overflow) в функции CRunningScript::ReadTextLabelFromScript (подробнее смотри ниже).
Подробнее про RCE с анимациями (рабочий RCE в SAMP 0.3.7-R5):
SAMP при применении анимаций записывает их библиотеку и название в буффер длинной 256 байт.
Однако скриптовая функция, которую вызывает SAMP (taskPlayAnimNonInterruptable), принимает библиотеку и название в буфферы длинной 16 и 24 байт соответственно и при этом не проверяет длину входящей строки. Благодаря этому мы получаем переполнение буффера на стэке, хоть и ограниченное — мы не можем записывать нулевые байты (но мы можем их писать в буффер SAMPа, что нам очень пригодится).
Чтобы обойти ограничение, мы можем перезаписать адрес возврата функции на гаджет, заранее подготовленный через RPC_ScrSetGravity (я использовал следующий гаджет: sub esp, ecx; ret;), а также значение регистра ECX (в который идут следующие 4 байта после названия анимации). Таким образом мы получаем возможность произвольно смещать ESP (единственным ограничением служит то, что в смещении не должно быть нулевых байт, но оно легко обходится заменой sub на add и наоборот). Его я сместил на буффер библиотеки анимации SAMPа + 4 байта (я использовал библиотеку анимаций: BAR + нулевой байт, так как она должна быть действительной, чтобы SAMP проиграл анимацию), в который я предварительно записал ROP-чейн и чуть модифицированный шеллкод отсюда.
Таким образом, мы получили возможность подгружать любую DLL в SAMP с сервера на последней версии — SAMP 0.3.7-R5.
Вместе с данным плагином рекомендуется установить исправление уязвимости в диалогах: Нажми на меня!
После установки последней версии с гитхаба у меня настройки гта слетели!