Исходник bitstream readbits stack overflow fix

povargek

Известный
Друг
101
315
Автору на заметку: всегда собирай статик в условиях сампа
 

FYP

Известный
Администратор
1,768
5,971
с этим фиксом можно крашить любыми пакетами с любыми данными, для этого нужно всего лишь пофлудить пакетами. но можно ничего и не делать, сервер сам крашнется. это из-за того, что хук в urmem туда-сюда перезаписывает инструкции при вызове оригинальной функции, а ReadBits вызывается из разных потоков и очень часто, в какой-то момент она вызовется с невалидными инструкциями в прологе в результате датарейса. для исправления надо заменить хуки на нормальные, например subhook, или сделать нормальный фикс, вместо хука пропатчив байт 0x7E по адресу 0x0804CE76 (linux 0.3.7-r2-1) на 0x76 (инструкцию jle на jbe).
а так можно пропатчить бинарник линукс сервера любой версии:
xxd -p -c0 samp03svr | sed 's/\(7e098b470801f03b07\)7e/\176/' | xxd -p -r > samp03svr_patched
 
Последнее редактирование:

Maddy

Известный
35
11
с этим фиксом можно крашить любыми пакетами с любыми данными, для этого нужно всего лишь пофлудить пакетами. но можно ничего и не делать, сервер сам крашнется. это из-за того, что хук в urmem туда-сюда перезаписывает инструкции при вызове оригинальной функции, а ReadBits вызывается из разных потоков и очень часто, в какой-то момент она вызовется с невалидными инструкциями в прологе в результате датарейса. для исправления надо заменить хуки на нормальные, например subhook, или сделать нормальный фикс, пропатчив байт 0x7E по адресу 0x0804CE76 (linux 0.3.7-r2-1) на 0x76 (инструкцию jle на jbe).
а так можно пропатчить бинарник линукс сервера любой версии:
xxd -p -c0 samp03svr | sed 's/\(7e098b470801f03b07\)7e/\176/' | xxd -p -r > samp03svr_patched
легенда
 

timmylich.

Новичок
3
0
с этим фиксом можно крашить любыми пакетами с любыми данными, для этого нужно всего лишь пофлудить пакетами. но можно ничего и не делать, сервер сам крашнется. это из-за того, что хук в urmem туда-сюда перезаписывает инструкции при вызове оригинальной функции, а ReadBits вызывается из разных потоков и очень часто, в какой-то момент она вызовется с невалидными инструкциями в прологе в результате датарейса. для исправления надо заменить хуки на нормальные, например subhook, или сделать нормальный фикс, пропатчив байт 0x7E по адресу 0x0804CE76 (linux 0.3.7-r2-1) на 0x76 (инструкцию jle на jbe).
а так можно пропатчить бинарник линукс сервера любой версии:
xxd -p -c0 samp03svr | sed 's/\(7e098b470801f03b07\)7e/\176/' | xxd -p -r > samp03svr_patched
Спасибо.
Пока одна проблема - хостер MyArena не позволяет подгрузить свой samp03svr на сервер, придётся ждать пока они проснуться...
 

Benjes

Новичок
2
2
Solución usando Pawn.RakNet

Pawn.RakNet:
IRawPacket:20(playerid, BitStream:bs) // 20 = ID_RPC
{
    new
        PacketID,
        RPC_ID,
        NumberOfBitsOfData
    ;

    BS_ReadValue(bs, PR_UINT8, PacketID, PR_UINT8, RPC_ID, PR_CUINT32, NumberOfBitsOfData);
    printf("IRawPacket -> ID_RPC: playerid: %d, RPC_ID: %d, NumberOfBitsOfData: %d", playerid, RPC_ID, NumberOfBitsOfData);

    if (PacketID == 40 || (NumberOfBitsOfData >= 0x1FFFFF || NumberOfBitsOfData <= 0x80000000 || NumberOfBitsOfData < 0))
    {
        new blockIp[32];
        GetPlayerIp(playerid, blockIp, sizeof blockIp);

        printf("[FIX CRASHER] RPCID: %d, NumberOfBitsOfData: %d", RPC_ID, NumberOfBitsOfData);
        BlockIpAddress(blockIp, 60 * 1000 * 2);

        return false;
    }

    return true;
}
 
Последнее редактирование:
  • Влюблен
  • Нравится
Реакции: Tornamic и King_Agressor

fzfzfz123

Новичок
9
22
с этим фиксом можно крашить любыми пакетами с любыми данными, для этого нужно всего лишь пофлудить пакетами. но можно ничего и не делать, сервер сам крашнется. это из-за того, что хук в urmem туда-сюда перезаписывает инструкции при вызове оригинальной функции, а ReadBits вызывается из разных потоков и очень часто, в какой-то момент она вызовется с невалидными инструкциями в прологе в результате датарейса. для исправления надо заменить хуки на нормальные, например subhook, или сделать нормальный фикс, вместо хука пропатчив байт 0x7E по адресу 0x0804CE76 (linux 0.3.7-r2-1) на 0x76 (инструкцию jle на jbe).
а так можно пропатчить бинарник линукс сервера любой версии:
xxd -p -c0 samp03svr | sed 's/\(7e098b470801f03b07\)7e/\176/' | xxd -p -r > samp03svr_patched
это просто исправление одного бита! идеально 😆
 
  • Нравится
Реакции: FYP

Nexius

Известный
34
29
А что ты хотел увидеть? Никто бесплатно тебе "супер рабочий" скрипт не напишет.
Как видишь, уже написали (бинарники тут). Но лично я рекомендую омп как вариант, с которым вряд ли возникнут и любые возможные прецеденты в дальнейшем, при нахождении чего-то подобного в иной раз у самп сервера.
 

_razor

t.me/sssecretway | ТГК: t.me/razor_code
Всефорумный модератор
1,972
3,287
Solución usando Pawn.RakNet

Pawn.RakNet:
IRawPacket:20(playerid, BitStream:bs) // 20 = ID_RPC
{
    new
        PacketID,
        RPC_ID,
        NumberOfBitsOfData
    ;

    BS_ReadValue(bs, PR_UINT8, PacketID, PR_UINT8, RPC_ID, PR_CUINT32, NumberOfBitsOfData);
    printf("IRawPacket -> ID_RPC: playerid: %d, RPC_ID: %d, NumberOfBitsOfData: %d", playerid, RPC_ID, NumberOfBitsOfData);

    if (PacketID == 40 || (NumberOfBitsOfData >= 0x1FFFFF || NumberOfBitsOfData <= 0x80000000 || NumberOfBitsOfData < 0))
    {
        new blockIp[32];
        GetPlayerIp(playerid, blockIp, sizeof blockIp);

        printf("[FIX CRASHER] RPCID: %d, NumberOfBitsOfData: %d", RPC_ID, NumberOfBitsOfData);
        BlockIpAddress(blockIp, 60 * 1000 * 2);

        return false;
    }

    return true;
}
а если пакет будет обернут в ID_TIMESTAMP?
 

Nexius

Известный
34
29
Solución usando Pawn.RakNet

Pawn.RakNet:
IRawPacket:20(playerid, BitStream:bs) // 20 = ID_RPC
{
    new
        PacketID,
        RPC_ID,
        NumberOfBitsOfData
    ;

    BS_ReadValue(bs, PR_UINT8, PacketID, PR_UINT8, RPC_ID, PR_CUINT32, NumberOfBitsOfData);
    printf("IRawPacket -> ID_RPC: playerid: %d, RPC_ID: %d, NumberOfBitsOfData: %d", playerid, RPC_ID, NumberOfBitsOfData);

    if (PacketID == 40 || (NumberOfBitsOfData >= 0x1FFFFF || NumberOfBitsOfData <= 0x80000000 || NumberOfBitsOfData < 0))
    {
        new blockIp[32];
        GetPlayerIp(playerid, blockIp, sizeof blockIp);

        printf("[FIX CRASHER] RPCID: %d, NumberOfBitsOfData: %d", RPC_ID, NumberOfBitsOfData);
        BlockIpAddress(blockIp, 60 * 1000 * 2);

        return false;
    }

    return true;
}
Not a proper solution, the cause is not related exactly to this packet you're checking
 
  • Нравится
Реакции: 1NEXPL1CA

pendaras

Новичок
19
7
с этим фиксом можно крашить любыми пакетами с любыми данными, для этого нужно всего лишь пофлудить пакетами. но можно ничего и не делать, сервер сам крашнется. это из-за того, что хук в urmem туда-сюда перезаписывает инструкции при вызове оригинальной функции, а ReadBits вызывается из разных потоков и очень часто, в какой-то момент она вызовется с невалидными инструкциями в прологе в результате датарейса. для исправления надо заменить хуки на нормальные, например subhook, или сделать нормальный фикс, вместо хука пропатчив байт 0x7E по адресу 0x0804CE76 (linux 0.3.7-r2-1) на 0x76 (инструкцию jle на jbe).
а так можно пропатчить бинарник линукс сервера любой версии:
xxd -p -c0 samp03svr | sed 's/\(7e098b470801f03b07\)7e/\176/' | xxd -p -r > samp03svr_patched

Это не решение, это костыль который открывает другую проблему, она снимает проверки которые были заданы разработчиком, это не решение.

Тем более MyArena написала уже фикс этого крашера, всё кончено.
 

livingflore

Известный
370
321
Это не решение, это костыль который открывает другую проблему, она снимает проверки которые были заданы разработчиком, это не решение.

Тем более MyArena написала уже фикс этого крашера, всё кончено.
пользоваться майареной в 2024 году, ну для вас реально всё кончено, без обид)
 

pendaras

Новичок
19
7
пользоваться майареной в 2024 году, ну для вас реально всё кончено, без обид)

Ну это твоё личное мнение)
Арена досихпор держит хорошие сервера но у них хороши в основном VDS сервера, я учавствовал в тесте плагина по этому могу сказать что он работает, а то что прислал FYP открывает новую проблему.

ProcessCmds на PRO сервере MyArena.