Перейти к содержимому

Приветствуем вас на 99Fps.Ru - Дом, милый дом!
Зарегистрируйтесь сейчас, чтобы получить доступ ко всем нашим функциям. После регистрации и входа в систему Вы сможете создавать темы, отвечать на существующие темы, использовать систему репутации ввиде бананчиков, получить свой собственный мессенджер, размещать обновления статусов, управлять профилем и многое другое. Если у вас уже есть учетная запись, Войдите - Регистрация нового аккаунта


Фотография

[PAWN] Поиск уязвимостей


  • Закрытая тема Тема закрыта
Сообщений в теме: 10

#1
mde...

mde...
  • Пользователи
  • 44 сообщений





Сейчас многие плагины, которые лежат в паблике написаны криворукими детьми, в которых есть море недочётов и ошибок через которые можно крашнуть сервер.

Недавно увидел ошибку в логе.

 



 
L 10/30/2013 - 13:22:38: [CSTRIKE] Non-player entity -1 out of range
L 10/30/2013 - 13:22:38: [AMXX] Run time error 10 (plugin "jbextreme.amxx") (native "cs_set_weapon_ammo") - debug not enabled!
L 10/30/2013 - 13:22:38: [AMXX] To enable debug mode, add "debug" after the plugin name in plugins.ini (without quotes).

 

О чём это говорит? Во время выдачи патронов игрок вышел с сервера, из за этого произошёл краш. Собственно при выдаче патронов в исходнике не было проверок is_user_alive или is_user_connected, если были бы проверки, то патроны выдались только тому кто жив/подключен. Собственно можно выйти с сервера и сервер крашится.

Многие используют инклюд cstrike с cs_get_user без доп. проверок, которые не обходимы, в отличии от get_user

 

by mde ©

 

Created 02.11.2013 on youhack.
  • 1

#2
 Steve

Steve
  •  Создатели
  • 671 сообщений





Наверно надо добавить тег "PAWN", и синтаксис к коду.
  • 0

99fps_1404425473__screenshot_209.png

99fps_1429548516__screenshot_1.png


#3
Eriurias

Eriurias
  • Пользователи
  • 109 сообщений





[spoiler=На заметку]

На заметку: в проверке is_user_alive() уже имеется проверка на коннект.

This also checks if the player is connected so you do not have to use is_user_connected() as well. 

Example: 
if(is_user_connected(id) && is_user_alive(id)){ 

can now be 

if(is_user_alive(id)){


  • 2


Если человека нельзя вылечить, это не значит, что ему нельзя помочь. © Google.


#4
mde...

mde...
  • Пользователи
  • 44 сообщений





[spoiler=На заметку]

На заметку: в проверке is_user_alive() уже имеется проверка на коннект.

Это очевидно, дело в том, что не во всех случаях подходит is_user_alive() (по смыслу)
  • 0

#5
Eriurias

Eriurias
  • Пользователи
  • 109 сообщений





Это было исключительно "На заметку"
  • 0


Если человека нельзя вылечить, это не значит, что ему нельзя помочь. © Google.


#6
serfreeman1337

serfreeman1337
  • Пользователи
  • 2 сообщений





От этого сервер никак не может крашнутся.

В самом коде модуля cstrike:


static cell AMX_NATIVE_CALL cs_set_weapon_ammo(AMX *amx, cell *params) // cs_set_weapon_ammo(index, newammo); = 2 params
{
    // Set amount of ammo in weapon's clip
    // params[1] = weapon index
    // params[2] = newammo
 
    // Valid entity should be within range
    CHECK_NONPLAYER(params[1]);
 
    // Make into edict pointer
    edict_t *pWeapon = INDEXENT(params[1]);
 
    *((int *)pWeapon->pvPrivateData + OFFSET_CLIPAMMO) = params[2];
 
    return 1;
}

Сначала будет проверка на индекс игрока, и если он выходит за допустимые пределы, будет возвращено 0 и произведена запись в еррор лог. И только после этой проверки модуль полезет в оффсеты игрока, которые и могут вызвать краш при их отсутствии. 

И все  is_user_alive или is_user_connected - костыли. Правильно написанный означает что таких ситуаций вообще не должно быть. 
  • 0

#7
Eriurias

Eriurias
  • Пользователи
  • 109 сообщений





И все  is_user_alive или is_user_connected - костыли

В случае если функция уже предусматривает такого рода проверки, то да. В остальных случаях ты заблуждаешься.
  • 0


Если человека нельзя вылечить, это не значит, что ему нельзя помочь. © Google.


#8
serfreeman1337

serfreeman1337
  • Пользователи
  • 2 сообщений





ЛОЛ!

cs_set_weapon_ammo используется вместе ID энтити оружия, а не игрока.


// params[1] = weapon index
Даже в логах сказано:


Non-player entity -1 out of range
is_user_alive и is_user_connected для игроков, уже фейл.

И почему мы допустили что где-то появилось -1 ?
  • 0

#9
Eriurias

Eriurias
  • Пользователи
  • 109 сообщений





cs_set_weapon_ammo

Причем здесь cs_set_weapon_ammo вообще? Я в целом говорю! С чего это ты взял, что проверка на коннект или на мертв/жив костыль? Это костыль в случае когда функция уже имеет проверку на коннект, типа такого бреда: 


if (!is_user_alive(id) || !is_user_connected(id)) return;
А ошибочный индекс может быть по нескольким причинам, начиная от не правильно подобранного алгоритма в цикле.
  • 0


Если человека нельзя вылечить, это не значит, что ему нельзя помочь. © Google.


#10
Eriurias

Eriurias
  • Пользователи
  • 109 сообщений





И по теме:

О чём это говорит? Во время выдачи патронов игрок вышел с сервера, из за этого произошёл краш.

Во-первых, краш происходит далеко не сразу и не факт, что он вообще возникнет, все зависит от ситуации.

Во-вторых, причина возникновения данной ошибки не всегда заключается в проверке на жив/мертв/подключен.
  • 0


Если человека нельзя вылечить, это не значит, что ему нельзя помочь. © Google.


#11
mde...

mde...
  • Пользователи
  • 44 сообщений





ЛОЛ!

cs_set_weapon_ammo используется вместе ID энтити оружия, а не игрока.


// params[1] = weapon index
Даже в логах сказано:


Non-player entity -1 out of range
is_user_alive и is_user_connected для игроков, уже фейл.

И почему мы допустили что где-то появилось -1 ?

Возможно ты и прав, но все же данный недочет может означать, то что я описал.
  • 0




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных