Mix Maker Fix Bug Exploit (Todos a Spec)
#1
Buenas gente, les dejo el fix del Mix Maker v10.0 del "Keys and value can't be null"(creo que es).
Bueno, esto es información totalmente educativa y sin fines malignos

Explicación
1- El jugador juan entra al servidor y selecciona el "Team Join Class Menú"(selección de models)
2- El jugador juan se queda en ese menú, por ende, jamás elige la clase de model que usará.
3- El administrador mengano esta listo para mandar el mix, por ende manda todos a spec
4- El jugador juan elige el model que antes jamás eligió, entonces el model queda en "" y hace crashear el servidor.

Bueno, ahora que sabemos como funciona, vamos a la solución.

En nuestro Mix Maker v10.0 buscaremos la siguiente función

Mix maker default
Código PHP:
public ExtraStuff_Handler(idMenuitem) {
  if (item == MENU_EXIT) {
    if (is_user_connected(id))
      OpenMixMenu(id)

    return PLUGIN_HANDLED
  
}

  new iData[6]
  new iName[64]
  new Access
  
new Callback

  menu_item_getinfo
(MenuitemAccessiData5iName63Callback)

  new Key str_to_num(iData)

  switch (Key) {
  case 1:
    {
      set_hudmessage(646464, -1.00.2110.25.00.010.1)
      show_hudmessage(0"Todos para Spec")

      for (new 1<= MaxPlayersi++) {
        if (is_user_connected(i)) //Bien acá esta el error. Explicare cual es.
        {
          set_pev(ipev_deadflagDEAD_DEAD)
          cs_set_user_team(iCS_TEAM_SPECTATOR)

          BlockClCorpse[i] = true
        
}
      }

      if (is_user_connected(id))
        Extras(id)
    }

  case 2:
    {
      if (is_user_connected(id))
        KickMenu(id)
    }

  case 3:
    {
      if (is_user_connected(id))
        BanMenu(id)
    }

  }
  menu_destroy(Menu)
  return PLUGIN_HANDLED


Bueno, como ven en el for que manda todos a spec, chequea is_user_connected pero jamás chequea si esta vivo el player.
Ahora el exploit como explique antes jamás elige el model por lo tanto jamás esta vivo!!.
Entonces, vuelve a mandarlo spec porque no chequea si esta vivo o no. Ahí esta la falla de programación. Si chequea que esta vivo, lo manda a spec, si no, va a seguir en el mismo menú de clases y cuando quiera conectarse, se conectara normal..

Mix maker fix
Código PHP:
public ExtraStuff_Handler(id,Menu,item

 if(
item == MENU_EXIT)
 {
 if(
is_user_connected(id))
 
OpenMixMenu(id)
 
 return 
PLUGIN_HANDLED
 
}
 
 new 
iData[6]
 new 
iName[64]
 new 
Access
 
new Callback
 
 menu_item_getinfo
(Menu,item,Access,iData,5,iName,63,Callback)
 
 new 
Key str_to_num(iData)
 
 switch(
Key)
 { 
 case 
:
 {
 
set_hudmessage(64,64,64,-1.0,0.21,1,0.2,5.0,0.01,0.1)
 
show_hudmessage(0,"Todos para Spec")
 
 for(new 
1;<= MaxPlayers;i++)
 {
 if(
is_user_alive(i)) //si esta conectado y vivo!!! lo manda a spec. 
 

 
set_pev(i,pev_deadflag,DEAD_DEAD)
 
cs_set_user_team(i,CS_TEAM_SPECTATOR)
 
 
 
BlockClCorpse[i] = true
 
}
 }
 
 if(
is_user_connected(id))
 
Extras(id)
 }
 
 case 
:
 {
 if(
is_user_connected(id))
 
KickMenu(id)
 }
 
 case 
:
 {
 if(
is_user_connected(id))
 
BanMenu(id)
 }
 
 }
 
menu_destroy(Menu)
 return 
PLUGIN_HANDLED

Bueno, esto fue lo que estuvimos probando, así que espero que lo metan en su mix maker e intenten hacer de esta información algo bueno para que dejen de matar el cs. Ahora sí, los amooo <3.
Responder
#2
Clave amiguero!
Responder
#3
No hace falta usar is_user_connected & is_user_alive.

Con el chequeo de alive únicamente sirve
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
Responder
#4
Te indente el código con un beautifier online porque me hace doler los ojos verlo como estaba. No quedo perfecto pero mejor que antes está
[Imagen: paypalqr.png]
Responder
#5
(03/06/2020, 08:10 AM)Neeeeeeeeeel.- escribió: Te indente el código con un beautifier online porque me hace doler los ojos verlo como estaba. No quedo perfecto pero mejor que antes está

Beautifier salva! Jajajaja
Buen aporte, gracias!!
(12/03/2014, 08:11 PM)roccoxx escribió: jajajajajajajajajajajajajajajaajajajajajaajajajajajajajajajajajajajajajajajajajajajajajajajjajajjajajajajaja

todo eso elevado a la quinta potencia.
Responder
#6
(03/06/2020, 12:57 PM)acetatomil escribió: Beautifier salva! Jajajaja
Buen aporte, gracias!!
Indentar correctamente y in IDE que te ayude es lo que realmente salva!
[Imagen: paypalqr.png]
Responder
#7
(03/06/2020, 01:08 PM)Neeeeeeeeeel.- escribió: Indentar correctamente y in IDE que te ayude es lo que realmente salva!

Exactamente! Dividir y leer con buena expresión a simple vista cada bloque de código!! Más que estética, orden y progreso.
(12/03/2014, 08:11 PM)roccoxx escribió: jajajajajajajajajajajajajajajaajajajajajaajajajajajajajajajajajajajajajajajajajajajajajajajjajajjajajajajaja

todo eso elevado a la quinta potencia.
Responder
#8
(03/06/2020, 08:01 AM)RauliTop escribió: No hace falta usar is_user_connected & is_user_alive.

Con el chequeo de alive únicamente sirve

Cada vez que usas for con get_maxplayers(); es necesario si o si (al menos que quieras obtener el player) usar is_user_connected. Porque si no, si tengo 32 slots y solamente tengo 10 conectados, los otros 22 serian null. Y me devolveria todo "0". Para evitar eso, directamente obtengo los "10" conectados y listo

(03/06/2020, 08:10 AM)Neeeeeeeeeel.- escribió: Te indente el código con un beautifier online porque me hace doler los ojos verlo como estaba. No quedo perfecto pero mejor que antes está

No estaba así pero cuando edite el tema, se puso todo así Triste
Responder
#9
(03/06/2020, 04:17 PM)Niper.-. escribió: Cada vez que usas for con get_maxplayers(); es necesario si o si (al menos que quieras obtener el player) usar is_user_connected. Porque si no, si tengo 32 slots y solamente tengo 10 conectados, los otros 22 serian null. Y me devolveria todo "0". Para evitar eso, directamente obtengo los "10" conectados y listo


No estaba así pero cuando edite el tema, se puso todo así Triste
si usas alive no es necesario el connected, haz la prueba

alive ya chequea si está conectado, por lo tanto, devuelve false en aquellos que no están conectados ni vivos
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
Responder
#10
Que grande!
Responder
#11
En algunos casos, el jugador puede estar muerto y en un equipo?

Código PHP:
for(new 1;<= MaxPlayers;i++)
{
 if(
is_user_connected(i) && (<= get_user_team(i) <= 2))
 { 
 
set_pev(i,pev_deadflag,DEAD_DEAD);
 
cs_set_user_team(i,CS_TEAM_SPECTATOR);
 }


Siempre me aseguro de estar en un equipo válido antes que nada.
Responder
#12
Alguno me hace el favor de compilarlo ? estoy teniendo unos cuantos problemas..
Responder
#13
(30/06/2020, 10:08 PM)Gstrigl escribió: Alguno me hace el favor de compilarlo ? estoy teniendo unos cuantos problemas..

Y si pasas los problemas? no sé solo digo...

Aquí nadie te puede pasar un binario...
Responder
#14
y algo asi tambien funcionaria?
Código PHP:
public allToSpect()
{
    for(new 
id 1;id <= MaxPlayers;id++)
    {
        if (
is_user_connected(id))
        {
            if(
is_user_alive(id))
            
user_kill(id);
            
            
cs_set_user_team(idCS_TEAM_SPECTATOR);
            
BlockClCorpse[id] = true
        
}
    }
    return 
PLUGIN_HANDLED;

Responder
#15
(01/07/2020, 10:33 AM)alexiways escribió: y algo asi tambien funcionaria?
Código PHP:
public allToSpect()
{
 for(new 
id 1;id <= MaxPlayers;id++)
 {
 if (
is_user_connected(id))
 {
 if(
is_user_alive(id))
 
user_kill(id);
 
 
cs_set_user_team(idCS_TEAM_SPECTATOR);
 
BlockClCorpse[id] = true
 
}
 }
 return 
PLUGIN_HANDLED;


Código PHP:
public allToSpect()
{
 for(new 
id 1;id <= MaxPlayers;id++)
 {
 if (
is_user_connected(id) && is_user_alive(id))
 {
 
user_kill(id);
 
 
cs_set_user_team(idCS_TEAM_SPECTATOR);
 
BlockClCorpse[id] = true
 
}
 }
 return 
PLUGIN_HANDLED

Así te ahorras una línea. Nothingdohere
Corazón I dream of someday being able to have your near. Corazón
[Imagen: 76561199006140497.png]
Responder
#16
(01/07/2020, 10:49 AM)andres_1041 escribió:
Código PHP:
public allToSpect()
{
 for(new 
id 1;id <= MaxPlayers;id++)
 {
 if (
is_user_connected(id) && is_user_alive(id))
 {
 
user_kill(id);
 
 
cs_set_user_team(idCS_TEAM_SPECTATOR);
 
BlockClCorpse[id] = true
 
}
 }
 return 
PLUGIN_HANDLED

Así te ahorras una línea. Nothingdohere
Eso no hace ninguna diferencia en tiempo de ejecución, la cantidad de lineas da igual lo importante son las instrucciones que se ejecutan en la CPU. Algo inteligente sería sacar is_user_connected, ya que esta implicito en is_user_alive
[Imagen: paypalqr.png]
Responder
#17
(01/07/2020, 10:49 AM)andres_1041 escribió: Así te ahorras una línea. Nothingdohere
se la ahorra y el code es otro

en el anterior si estaba vivo lo mataba pero también lo mandaba a espectador si estaba vivo o muerto, en el tuyo debe estar vivo para que lo mate y pase a espectador.
[Imagen: zcsztw-4.png] [Imagen: 6u5fj2-4.png]
[Imagen: linkedin_thumb_image.png][Imagen: 76561198283253977.png][Imagen: linkedin_thumb_image.png]
Responder
#18
Código PHP:
                    case :
                    {
                        
server_cmd("sv_restart 1");

                        
set_task(2.5"mandarTodosSpec"id);
                        
    
                        if(
is_user_connected(id))
                        
Extras(id)
                    }

public 
mandarTodosSpec(id)
{
    
set_hudmessage(64,64,64,-1.0,0.21,1,0.2,5.0,0.01,0.1)
    
show_hudmessage(0,"Todos para Spec")
    for(new 
1;<= MaxPlayers;i++)
    {
        if(
is_user_alive(i))
        {
            
set_pev(i,pev_deadflag,DEAD_DEAD)
            
cs_set_user_team(i,CS_TEAM_SPECTATOR)
            
            
            
BlockClCorpse[i] = true
            
        
}    
    }


(01/07/2020, 10:49 AM)andres_1041 escribió:
Código PHP:
public allToSpect()
{
 for(new 
id 1;id <= MaxPlayers;id++)
 {
 if (
is_user_connected(id) && is_user_alive(id))
 {
 
user_kill(id);
 
 
cs_set_user_team(idCS_TEAM_SPECTATOR);
 
BlockClCorpse[id] = true
 
}
 }
 return 
PLUGIN_HANDLED

Así te ahorras una línea. Nothingdohere

Te voy a poder seguir aplicando el exploit con ese metodo.

(12/06/2020, 02:11 PM)^SmileY escribió: En algunos casos, el jugador puede estar muerto y en un equipo?

Código PHP:
for(new 1;<= MaxPlayers;i++)
{
 if(
is_user_connected(i) && (<= get_user_team(i) <= 2))
 { 
 
set_pev(i,pev_deadflag,DEAD_DEAD);
 
cs_set_user_team(i,CS_TEAM_SPECTATOR);
 }


Siempre me aseguro de estar en un equipo válido antes que nada.

Lo mismo que andres.
Responder
#19
Gracias loco! funciona! dejo de caerse el servidor!
_____________________________________________________________________________
(05/08/2020, 06:47 PM)acetatomil escribió: Vos también sos trolazo por responder, y también me incluyo y el que lo lea también. Bue.

_____________________________________________________________________________
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)