Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Problema cuando atacan a mi programa C++

Estas en el tema de Problema cuando atacan a mi programa C++ en el foro de C/C++ en Foros del Web. Hola a todos, tengo un problema con un bot que estoy haciendo. El bot funciona bien y conecta a un Servidor de chat gratuito que ...
  #1 (permalink)  
Antiguo 23/04/2014, 22:51
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Problema cuando atacan a mi programa C++

Hola a todos, tengo un problema con un bot que estoy haciendo.
El bot funciona bien y conecta a un Servidor de chat gratuito que tengo, el bot no cae por lo que quedará conectado por horas, días o años.
El problema viene cuando lo pueden intentar atacar al bot por medio de mensajes en códigos binarios o algún otro método similar.

Para que se entienda un poco, en los chats IRC existen los famosos "ataques de clones", donde una o varias personas utilizan proxys para atacar masivamente al chat, ingresando muchos clones, pueden ser cientos, esto produce lag (retraso en los mensajes) en el servidor, por lo que, cuando uno envía un mensaje demora un poco más para que llegue.

Los clones son múltiples direcciones de IPs Proxys utilizadas masivamente para atentar contra un Servidor IRC de Chat, lo hacen para "tirar" (desconectar) usuarios, servicios, bots de seguridad, bueno un tema algo complejo y largo para el que no conoce sobre IRC.

El tema es que mi bot en C++ sufriría un ataque de este tipo ya que por alguna razón se traba el programa y ya no puede funcionar, de tal manera que no puedo hacer más que cerrarlo a fuerza mayor.

Para que se entienda mejor amigos, voy a dejar aquí abajo los msjs que dejan esos clones.
A la izquierda (antes de los mensajes) como a la derecha se pueden ver los 49 nicks conectados en el chat, que en este caso son 48 clones, poco para lo que saben ingresar.

http://subefotos.com/ver/?d1be1de242...d68432a88o.png

Y cuando el bot está conectado al Servidor y largan esos tipos de mensajes, hacen que a mi bot le pase esto:

http://subefotos.com/ver/?92b66933fb...ce3342168o.png

El error está marcado en un cuadro rojo ahí en la imágen.
Pero... a mi otro bot en Python no le pasa eso... osea muestra los números binarios de cada caracter (por ejemplo ñ o Ñ, los otros normales los muestra normal), por más que sea binario, aquí dejo una captura de un bot mío en Python:

http://subefotos.com/ver/?b524ecad87...3ebe84ebco.png

Quiero aclarar que yo soy el que hago las pruebas en mi servidor, yo uso conexión local simplemente para ingresar con mayor rapidéz y efectividad los clones.
No crean que hago esto en otros chats, por favor, ni se les ocurra, estoy haciendo estas pruebas porque estoy haciendo un Bot Escaner de Puertos Proxys para Servidores IRCd (Internet Relay Chat Daemon).
Este bot funcionaría conectado las 24 hs. en el chat y cuando entren los clones, serán expulsados por tener un X puerto abierto.

A mi me gustaría saber como puedo evitar esto que le pasa a mi bot, osea algún método para codificar los msjs o algo similar o que de alguna manera mi bot no sufra la desconexión forzosa por culpa de esos mensajes.
Me encantaría algo igual que Python.

Desde ya les agradezco amigos!!!
Gracias como siempre
  #2 (permalink)  
Antiguo 24/04/2014, 07:20
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema cuando atacan a mi programa C++

Estas describiendo el comportamiento de un programa mal escrito en C++.
Lo que observo es que estas accediendo a memoria que no tienes derecho a usar.

Sospecho que el programa es muy grande como para publicarlo, pero deberias al menos identificar las lineas asociadas al error y partir desde ellas las correcciones que requieres
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 24/04/2014, 07:34
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema cuando atacan a mi programa C++

Amigo CalgaryCorpus, he aumentado el tamaño del buffer y el bot ya no cae, pero se me ocasiona otro problema, el buffer deja de recibir información y en esta línea:

Código C++:
Ver original
  1. nret = recv(iSocket, recvbuf, 256, 0);

En mi otro código de Python, ese 256 está en 1024... mucha diferencia.

Pego aquí parte del código:

Código C++:
Ver original
  1. while (1) {
  2.         memset(&sendbuf, 0, sizeof(sendbuf));
  3.         memset(&recvbuf, 0, sizeof(recvbuf));
  4.  
  5.         nret = recv(iSocket, recvbuf, 256, 0);
  6.  
  7.         if(nret == SOCKET_ERROR) {
  8.             cout << "Error: No se ha podido conectar con el Servidor" << endl;
  9.             break;
  10.         }
  11.  
  12.         string Ping = string(recvbuf);
  13.         string Pingg = Ping.substr(0,4);
  14.         vector<string> arr;
  15.         arr=split(Ping,"\n");
  16.         string hola;
  17.  
  18.         for(size_t i=0;i<arr.size();i++)
  19.             hola = arr[i].c_str();
  20.             string pepito = hola.substr(0,4);
  21.             int TotalChars = Ping.length();
  22.             string PONG = "PONG " + hola.substr(5,TotalChars) + "\r\n";
  23.             char *probar = strdup(PONG.c_str());
  24.             cout << recvbuf << endl;
  25.             if (pepito == "PING") nret = send(iSocket, probar, strlen(probar), 0);
  26.     }

Espero que me ayuden como siempre!! Gracias amigos.

Las variables tienen ese pésimo nombre, pero luego cuando lo voy terminando al código de a poco, voy renombrando las variables y les asigno un nombre correcto.
  #4 (permalink)  
Antiguo 24/04/2014, 08:19
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema cuando atacan a mi programa C++

No estoy seguro si aumentar el tamaño de algo resuelve el problema.
Si tu problema era acceder a una seccion de memoria que no tenias derecho y le echas la culpa y lo resuelves aumentando el tamaño, no estas resolviendo el problema realmente, solo te estas comprando tiempo y el no resolverlo puede estar influyendo sobre otras partes de tu programa.

Dicho de otra manera, si esto fuera un dialogo:
- Hola, tengo 10 productos, enumerados del 35 al 44
- Extraña tu numeracion, dame el 23
- Pero si te digo que van del 35 al 44!
- Bueno, dame el 23
- Este tipo no entiende, bueno, agrandaré mi numeracion, ahora va de 20 al 44
- dame el 23
- Listo
...
horas despues .. se resolvio el que uno de los participantes no entiende y no usa los rangos que le informan?

- hola, otra vez, dame el 5
- pero!!!! otra vez!!!

etc.
__________________
Visita mi perfil en LinkedIn
  #5 (permalink)  
Antiguo 24/04/2014, 14:06
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Problema cuando atacan a mi programa C++

Hola:

La línea
Código C++:
Ver original
  1. string Pingg = Ping.substr(0,4);
asume q vas a recibir una cadena de al menos 4 caracteres, si recibes una cadena de menor longitud (como "aa") entonces te vas a encontrar con este error:
Código LOGFILE:
Ver original
  1. terminate called after throwing an instance of 'std::out_of_range'
  2. what(): basic_string:substr
  3. ....

corrige ese problema y prueba de nuevo.

slds;

nup_
  #6 (permalink)  
Antiguo 24/04/2014, 14:10
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema cuando atacan a mi programa C++

Muy bueno tu ejemplo, pude comprender, si es probable que esté violando la memoria de mi ordenador, pero no se como poder solucionarlo.
Cuando ese mensaje con símbolos lo envía tan sólo 1 usuario, el programa no cierra (poniendo el buffer en 256), por lo que no es problema de recibir esos símbolos o códigos binarios, el problema viene cuando envían demasiadas veces ese mensaje.

En Python y en muchos otros lenguajes, por lo general y dependiendo de que se quiera hacer, lo recomendable son 1024 Bytes de buffer y creo que para el programa que necesito estaría bien, de hecho nunca tube problema con mi otro bot en Python, hasta incluso en ese bot en Python lo he llegado a probar con un buffer de 4096 y tampoco tube problemas.

Entiendo que tenés razón, no puedo acceder a memoria que no me corresponde, pero la pregunta es: ¿Por qué cuando aumento el tamaño de buffer en el programa, se pruduce un error? En esta línea la condición se cumple:

Código C++:
Ver original
  1. if(nret == SOCKET_ERROR) {
  2.             cout << "Error: No se ha podido conectar con el Servidor" << endl;
  3.             break;
  4.         }

la condición if se cumple, osea que hay un error en el socket, problema al recibir datos, por esa razón ya no puedo ver por la consola lo que está pasando en el chat, por ejemplo si escriben o si alguien entra o sale de una sala/canal, además de que se detiene el bucle.

Pero ese error se produce apenas se abre la conexión, por lo que el bot entra al servidor y luego de un par de minutos, el bot cae, osea se cierra la conexión o se cerró antes, queda colgado el socket y tampoco puedo leer lo que sucede en el chat.

¿De qué manera puedo solucionarlo?
Trato de intentar solucionarlo pero no puedo, necesito un código que me ayude o el mío modificado para poder comprender porque ocurre eso inesperado, nunca debería darme error el programa por tan solo aumentar el tamaño del buffer, si eso es algo muy normal que no debería dar error en la lectura.

Gracias de antemano
  #7 (permalink)  
Antiguo 24/04/2014, 15:36
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema cuando atacan a mi programa C++

como esta definido recvbuf?
__________________
Visita mi perfil en LinkedIn
  #8 (permalink)  
Antiguo 24/04/2014, 15:43
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema cuando atacan a mi programa C++

Muchas gracias nup_, he corregido ese error, lo dejé así:

Código C++:
Ver original
  1. if (Ping.length() >= 4) { string Pingg = Ping.substr(0,4); }

Pero mi bot caía igual:

[17:13] -=> Botito_C_mas_mas Ha entrado {C@ArgentinaIRC-F20798E3}
[17:16] * Botito_C_mas_mas ha abandonado IRC (Ping timeout)

ese msj "Ping timeout" es porque el Servidor luego de masomenos 3 minutos, le envía una petición PING al usuario y el usuario debe responderla, en caso que no la responda, el servidor asume que el usuario ha caído, osea que su conexión se ha cerrado o colgado, entónces el mismo servidor, lo desconecta, aunque en este caso, el Bot quedó durante 3 minutos y luego cayó o mejor dicho el servidor lo desconectó.

El error que me daba era este:

Conectado al Servidor!
:127.0.0.1 NOTICE AUTH :*** Looking up your hostname...

:127.0.0.1 NOTICE AUTH :*** Found your hostname

:127.0.0.1 NOTICE Botito_C_mas_mas :*** If you are having problems connecting du
e to ping timeouts, please type /quote pong 5EE6AFD6 or /raw pong 5EE6AFD6 now.
PING :5EE6AFD6

:127.0.0.1 001 Botito_C_mas_mas :Welcome to the irc.abcd.net IRC Network Botito_
C_mas_mas!C@localhost.
:127.0.0.1 002 Botito_C_mas_mas :Your host is 127.0.0.1, running version Unreal3
.2.3
:127.0.0.1 003 Botito_C_mas_mas :This server was created Sun Mar 13 21:40:50 2
Error: No se ha podido conectar con el Servidor

y quedaba ahí nomás.

Quiero comentarles amigos que he podido solucionar el problema con éxito!!!!
El problema era este:

Código C++:
Ver original
  1. char recvbuf[256];

y lo dejé así:

Código C++:
Ver original
  1. char recvbuf[1024];

del mismo tamaño del buffer y no me dió más error, ahora funciona perfectamente!!!
He probado enviando esos mensajes muchas veces y el bot ya no cayó más!!!

Problema solucionado!!!

Muchas gracias CalgaryCorpus y nup_
  #9 (permalink)  
Antiguo 02/07/2014, 07:03
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Problema cuando atacan a mi programa C++

@Principe_Azul : hola amigo........

Me alegro te hayan ayudado...... solo me interesaria saber si hay algun "patron" que pudiera ayudar a detectar los clones como que:


- Ingresen todos "al tiempo" (en una ventana de tiempo demasiado estrecha) al chat (si fuera asi los echaria a todos) ... o...

- O envien mensajes todos juntos (con el criterio anterior)

- En los nombres (por ejemplo que sean totalmente randomicos sin ningun sub-string que sea una palabra de 4 o mas caracteres dentro)


Una medida adicional seria que si estas recibiendo mensajes largos y/o en codigo binario en una ventana de tiempo muy estrecha filtres x momentanemente a los usuarios que pueden unirse, eches a los desconocidos y solo perimitas enviar mensajes a los "validados" (que ya has detectado con anterioridad no son bots)
__________________
Salu2!

Etiquetas: funcion, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:41.