- Версия SA-MP
-
- 0.3.7 (R1)
- 0.3.7-R3
- 0.3.7-R4
- 0.3.7-R5
- 0.3DL
SAMP 0.3.7 MultiRCE Fix
Данный плагин исправляет несколько уязвимостей переполнения буффера, которые могут привести к RCE:
с меню, GameText и анимациями.
Поддерживаемые версии: SA-MP 0.3-DL R1, 0.3.7 R1, R3-1, R4, R5.Данный плагин исправляет несколько уязвимостей переполнения буффера, которые могут привести к RCE:
с меню, GameText и анимациями.
Краткое описание уязвимостей:
Уязвимость с меню: в общем исправлена в SA-MP 0.3.7-R4 (однако остаётся возможность повредить кучу с помощью ID меню выше 127). Заключается в переполнении буффера кучи (heap buffer overflow) в объекте CMenu (причиной этому служит отсутствие валидации количества строчек в меню), а также, что более важно, - в возможности записывания строчек в CMenu без нулевого байта на конце, что может привести к переполнению буффера на стэке (stack buffer overflow) в функции
Уязвимость с GameText: частично исправлена в SA-MP 0.3.7-R5, однако при правильном подборе входных данных всё ещё возможно её использование. Заключается в переполнении статического буффера (static buffer overflow) около массива
Уязвимость с анимациями: официально не исправлена, заключается в различии размеров буфферов на стэке между SAMP и GTA: SA, что приводит к переполнению буффера на стэке (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
(подробнее смотри ниже).SAMP при применении анимаций записывает их библиотеку и название в буффер длинной 256 байт.
Однако скриптовая функция, которую вызывает SAMP (taskPlayAnimNonInterruptable), принимает библиотеку и название в буфферы длинной 16 и 24 байт соответственно и при этом не проверяет длину входящей строки. Благодаря этому мы получаем переполнение буффера на стэке, хоть и ограниченное — мы не можем записывать нулевые байты (но мы можем их писать в буффер SAMPа, что нам очень пригодится).
Чтобы обойти ограничение, мы можем перезаписать адрес возврата функции на гаджет, заранее подготовленный через RPC_ScrSetGravity (я использовал следующий гаджет:
Таким образом, мы получили возможность подгружать любую DLL в SAMP с сервера на последней версии — SAMP 0.3.7-R5.
Однако скриптовая функция, которую вызывает 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.
Вложения
Последнее редактирование: