Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Dryken en 8 Agosto 2012, 17:23 pm



Título: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: Dryken en 8 Agosto 2012, 17:23 pm
Estaba probando hacer un simple automatizador de netcat cuando me ha surgido un problema. Trata de que strcat concatena funciones y te devuelve la función final con la suma de todo, pero quiero que en dicha suma haya 2 espacios.

Quiero pasar de ncIPPuerto ---->    nc IP Puerto

El código que tengo es este.

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <windows.h>
  4.  
  5. int main(){
  6. char puerto[25], ip[25];
  7. char netcat[]="nc";
  8.  
  9. printf("Introduce la IP:\t");
  10. scanf("%s",&ip);
  11. printf("Introduce el puerto:\t");
  12. scanf("%s",&puerto);
  13. strcat(netcat,ip);
  14. strcat(netcat,puerto);
  15.  
  16. system(netcat);
  17. while(getchar() !='\n');  
  18. getchar();
  19.  
  20. }


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: 0xDani en 8 Agosto 2012, 17:38 pm
Utiliza la misma funcion strcat() para concatenar nc con un espacio, y lo mismo con la otra cadena.

Saludos.


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: Dryken en 8 Agosto 2012, 17:52 pm
daniyo eso lo probe hace tiempo y no funciono por eso lo preguntaba, no es tan simple como parece.

Tu te refieres a por ejemplo esto...

Citar
char puerto[25], ip[25], espacio[5]=" ";
char netcat[]="nc";

printf("Introduce la IP:\t");
scanf("%s",&ip);
printf("Introduce el puerto:\t");
scanf("%s",&puerto);
strcat(netcat,ip);
strcat(netcat,espacio);
strcat(netcat,puerto);

system(netcat);
while(getchar() !='\n'); 
getchar();

Da problemas al ejecutar. Si coloco tambien espacio[5]=""; , vamos sin el espacio de por medio sigue sin dejar espacio.


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: 0xDani en 8 Agosto 2012, 17:55 pm
Pues prueba con "\t".


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: Dryken en 8 Agosto 2012, 18:13 pm
Tampoco va daniyo al colocar espacio[5]=" \t";.

Al colocar /t lo que sucede es que la siguiente función strcat(netcat,puerto); no se muestra por pantalla, aparece con el /t todas las funciones antes que de esta sea utilizada.

queda así

Citar
ncxxx.xxx.xxx.xxx



Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: durasno en 9 Agosto 2012, 00:06 am
Hola! busca sprintf

Saludos


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: do-while en 9 Agosto 2012, 00:16 am
¡Buenas!

De un primer vistazo lo que veo es que el problema puede estar en que la cadena netcat solo tiene 3 posiciones de memoria ({'n','c','\0'}). Prueba a darle mayor dimension y cuentanos.

Código
  1. char netcat[30]="nc"
  2.  

¡Saludos!


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: Dryken en 9 Agosto 2012, 01:52 am
durasno hebuscado como me has dicho y he probado la función sprintf. he visto que la ventaja que tiene es que en comparación con strcat permite espacios pero no permite ejecutar funciones del sistema system();

Aquí se puede ver que concatena con espacios y luego imprime por pantalla. No he colocado  system(netcat); porque entonces no funciona. vamos que con esta función estoy con las mismas, tiene un lado positivo y otro negativo. Os he dejado el código para que lo veáis de ejemplo.

Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3. int main(){
  4.   char puerto[25], ip[25], netcat[80];
  5.  
  6.   printf("Introduce la IP:\t");
  7.   scanf("%s",&ip);
  8.   printf("Introduce el puerto:\t");
  9.   scanf("%s",&puerto);
  10.  
  11.   sprintf(netcat, "\nnc %s %s\n", ip, puerto);
  12.   puts(netcat);  
  13.   getchar();
  14. }

Por cierto do-while probé a colocar una dimensión mayor pero no funcionó, seguramente será otra cosa.

Pufff...te pones a pensar y te das cuenta que colocar un simple espacio no es tán fácil como parece en strcat y que en sprintf no es posible ejecutar system(); , a ver si consigo hallar la forma en strcat.


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: Fire544 en 9 Agosto 2012, 04:16 am
Hola Dryken: mira todo lo que haces esta bien, tienes que dejar cada char [], con un espacio antes de concatenar, intenta hacer esto.

"nc ", " ip", " puerto".

Código
  1. char vector[]="nc ";
  2. strcat(vector, ip)
  3. strcat(vector, puerto);
  4. system(vector);
  5.  

Si te fijas en el codigo, todo bien pero algo ilogico, porque a lo mejor lo has intentado, pero fijate cuando termino de inicializar mi vector al declararlo, dejo el ultimo bytes en " ", esto es para concatenar con espacios, ten esto en cuenta y hazlo con char ip[], puerto[], a lo mejor puerto seria int, entonces haces un cast "strcat(vector, (int)puerto);"


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: durasno en 9 Agosto 2012, 05:11 am
Citar
no permite ejecutar funciones del sistema system();
nose de donde sacaste eso. Lo unico que hace sprintf es almacenar una cadena, con cierto formato, en un arreglo; en tu caso en netcat

Ejemplo simple:
Código
  1. int main(void)
  2. {
  3. char a[]="dir";
  4. char b[]="Java" //es una carpeta que tengo en el escritorio
  5. char cmd[20];
  6.  
  7. sprintf(cmd,"%s %s",a,b); // armo el comando a ejecutar
  8.  
  9. system(cmd); // ejecuto: dir Java
  10. //system("PAUSE");
  11. }

No uso nc ya que la consola no me reconoce el comando como valido(hay q instalarlo?? :S)

Saludos


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: Risketo en 9 Agosto 2012, 06:35 am
Yo creo que una de las soluciones podría ser esta:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(){
  6. char puerto[25], ip[25];
  7. char netcat[]="nc";
  8.  
  9.  
  10. printf("Introduce la IP:\t");
  11. scanf(" %s",&ip);
  12. printf("Introduce el puerto:\t");
  13. scanf(" %s",&puerto);
  14.  
  15. strcat(netcat," ");
  16. strcat(netcat,ip);
  17. strcat(netcat," ");
  18. strcat(netcat,puerto);
  19.  
  20. system(netcat);
  21.  
  22. while(getchar() !='\n');  
  23. return 0;
  24.  
  25. }
  26.  

Lo he probado en linux con otra orden en la terminal pero creo que poniendo el #include <windows.h> debería funcionar.


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: BlackZeroX en 9 Agosto 2012, 06:57 am
.
El realizar un strcat() en un buffer es para uno establecido dará POSIBLEMENTE un overflow de indices segun la lontitud de este... por ejemplo:

Código
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <windows.h>
  5.  
  6. int main(){
  7. char puerto[25], ip[25];
  8. char netcat[]="nc"; // produce un error por que aquí solo hay una dimension de 3 indices... y se requiere una aun mas grande...
  9.  
  10. printf("Introduce la IP:\t");
  11. scanf("%s",&ip);
  12. printf("Introduce el puerto:\t");
  13. scanf("%s",&puerto);
  14. strcat(netcat,ip);
  15. strcat(netcat,puerto);
  16.  
  17. system(netcat);
  18. while(getchar() !='\n');  
  19.  
  20. }
  21.  
  22.  

Estas haciendo la instrucción ya dicha pero dicha instrucción SOLO concatena mas NO redimensiona por lo tando debes tener un 3er buffer donde meter dicha concatenación CON UN BUFFER ADECUADO...

Código
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <windows.h>
  5.  
  6. int main()
  7. {
  8.    char *res = NULL;
  9.    const char COMANDO[] = "nc ";
  10.    char puerto[25] = {},
  11.         ip[25] = {},
  12.         buffer[sizeof COMANDO + sizeof puerto + sizeof ip - 2] = {}; // el menos 2 es por que dos de las variables tienen un caracter \0 el cual no nos interesan, por que no restar -3? es simple necesitamos un byte '\0'...
  13.  
  14. //    printf("%d\n", sizeof buffer); // oslo para saber cuanto buffer tenemos realmente...
  15.  
  16.    printf("Introduce la IP:\t"); fflush(stdout); // realizo un fflush debido a que en el printf() no termino con \n
  17.    fgets(ip, sizeof puerto - 1, stdin); // con este -1 nos aseguramos que el ultimo byte sea SIEMPRE un \0
  18.  
  19.    printf("Introduce el puerto:\t"); fflush(stdout); // realizo un fflush debido a que en el printf() no termino con \n
  20.    fgets(puerto, sizeof puerto - 1, stdin); // con este -1 nos aseguramos que el ultimo byte sea SIEMPRE un \0
  21.  
  22.    strcat(buffer, COMANDO);
  23.    strcat(buffer, ip);
  24.    strcat(buffer, puerto);
  25.  
  26.    //  sustituimos todos los '\n' por ' '
  27.    res = strpbrk(buffer, "\n");
  28.    while (res) {
  29.        *res = ' ';
  30.        res = strpbrk(res, "\n");
  31.    }
  32.  
  33. //    puts(buffer); // solo para mostrar el comando...
  34.  
  35.    system(buffer);
  36.  
  37.    fflush(stdin); // para que la siguiente instruccion no tenga problemas con el buffer de entrada la vació...
  38.    while(getchar() !='\n');
  39.  
  40.    return 0;
  41. }
  42.  
  43.  

Para mas información: http://www.cplusplus.com/reference/clibrary/cstring/strcat/

Yo me voy a jugar nos vemos.

Dulces Lunas!¡.


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: Dryken en 9 Agosto 2012, 16:31 pm
Fire544 he probado a dejar el espacio y a cambiar el puerto de cadena (char) a integer (int) pero no es posible tratar con 2 formatos distintos, sólo me permite de char a char o de int a int.

durasno el sprintf claro que me he fijado, tiene la misma función que el strcat, almacena cadenas en una única variable, pero después de eso estoy en las mismas, dejar el espacio al utilizar la función system.

Por cierto bajate el netcat de aquí y copialo a windows/system32

http://netcat.sourceforge.net/download.php

Risketo he probado tu posible solución pero la verdad es que no entiendo porque no permite introducir el espacio tal cual al sumarlo a la cadena, al imprimirlo por pantalla si se muestra pero al cargarlo con el system(); no va  :-\

BlackZeroX (Astaroth) he visto tu código y por lo visto mi error era que no redimensionaba, vamos que se supone que se desborda el código al concatenar, por ello la posibe solución es limpiar el buffer lo mejor posible tal cual tu has echo en tu código, creo que es ese el problema según he entendido.

Me ha dado coraje que tu código con lo trabajado que está y que a simple vista parece que debe solucionar el error, pues que no me lo soluciona, al menos a mi. Le voy a echar ahora un vistazo a tu enlace sobre la función strcat aver que más consigo informarme.

Gracias por la colaboración compañeros, seguro que en verdad es una tonteria resolver este misterio pero menuda tonteria más grande cuando se sepa como se hace.


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: durasno en 10 Agosto 2012, 01:59 am
Citar
Me ha dado coraje que tu código con lo trabajado que está y que a simple vista parece que debe solucionar el error, pues que no me lo soluciona, al menos a mi. Le voy a echar ahora un vistazo a tu enlace sobre la función strcat aver que más consigo informarme.
esto me parece que pasa por otro lado, y no por los programas que te pasaron ya que cualquiera deberia andar. Preguntas tontas:
¿podes ejecutar nc desde el interprete de comandos?
¿al ejecutar nc con system la consola muestra algo ó se cuelga el programa?


Saludos


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: Fire544 en 10 Agosto 2012, 06:47 am
Mira he desarrollado una solucion a tu problema, al no tener netcat en mi system32, lo aplique al uso de telnet ya que se le pasan mas de 1 argumento que es lo que quieres, solo que este para otros propositos minusculos, solo tienes que modificar las constantes de printf() y la inicializacion del vector telnet.

Código
  1. #include <stdio.h>
  2. #include <string.h> //tenemos strcat();
  3. #include <stdlib.h> //tenemos system()
  4.  
  5. int main()
  6. {
  7.    char telnet[7]="telnet", ejecutar[40], ip[15], puerto[5];
  8.  
  9.    for(int i=0; i<40; i++)
  10.    {ejecutar[i]='\0';} //llenamos el vector de espacios en blanco, para no dejar basuras !!
  11.  
  12.    printf("IP Server: ");
  13.    gets(ip);
  14.  
  15.    if(strlen(ip)>=15) //comprobamos si se ha llegado al limite del vector y
  16.    {return 1;}         //retornamos 1 en caso contrario no retornamos nada
  17.  
  18.    printf("Puerto Server: ");
  19.    gets(puerto);
  20.  
  21.   if(strlen(puerto)>=5)
  22.    {return 1;}
  23.  
  24.    strcat(ejecutar, telnet);
  25.    strcat(ejecutar, " "); //concatenamos espacios a nuestro vector
  26.    strcat(ejecutar, ip);
  27.    strcat(ejecutar, " ");
  28.    strcat(ejecutar, puerto);
  29.  
  30.    system(ejecutar);
  31.  
  32.    getchar();
  33.    }
  34.  

Suerte !!  ;-)


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: BlackZeroX en 10 Agosto 2012, 07:44 am
@Fire544
No es recomendable usar scanf() de esa manera...

Dulces Lunas!¡.


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: do-while en 10 Agosto 2012, 14:31 pm
¡Buenas!

Tampoco deberias de empezar haciendo
Código
  1. strcat(ejecutar,telnet);
, ya que no has inicializado ejecutar, y es mas que posible que no empiece por '\0' o incluso que en ninguna de sus posiciones contenga dicho caracter, por lo que strcat podria salirse de la dimension que le has asignado o incluso crashear el programa.

Empieza con strcpy, si sabes que la cadena de origen va a caber dentro del destino, sino, strncpy para asegurarte de que estas dentro de los limites de la memoria asignada.

¡Saludos!


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: Fire544 en 10 Agosto 2012, 15:39 pm
BlackZeroX (Astaroth) Comprendo, tienes razon, luego se producirian errores logicos, pero mira esta seria una buena correccion !!

Código
  1. printf("Named Server: ");
  2.    gets(ip);
  3.  
  4.    if(strlen(ip)>=15) //comprobamos que nuestro vector no este al limite de caracteres
  5.    {return 1;} //tambien puedes devolver un mensaje avisando de la falta de espacio
  6.  


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: Fire544 en 10 Agosto 2012, 15:51 pm
¡Buenas!

Tampoco deberias de empezar haciendo
Código
  1. strcat(ejecutar,telnet);
, ya que no has inicializado ejecutar, y es mas que posible que no empiece por '\0' o incluso que en ninguna de sus posiciones contenga dicho caracter, por lo que strcat podria salirse de la dimension que le has asignado o incluso crashear el programa.

Empieza con strcpy, si sabes que la cadena de origen va a caber dentro del destino, sino, strncpy para asegurarte de que estas dentro de los limites de la memoria asignada.

¡Saludos!

Si mira entiendo lo que planteas, pero fijate en el codigo, que inicializo el vector ejecutar llanandolo de '\0'.

Código
  1.  
  2. for(int i=0; i<40; i++)
  3.    {ejecutar[i]='\0';} //llenamos el vector de espacios en blanco, para no dejar basuras !!
  4.  


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: do-while en 10 Agosto 2012, 16:22 pm
Si mira entiendo lo que planteas, pero fijate en el codigo, que inicializo el vector ejecutar llanandolo de '\0'.

Código
  1.  
  2. for(int i=0; i<40; i++)
  3.    {ejecutar[i]='\0';} //llenamos el vector de espacios en blanco, para no dejar basuras !!
  4.  

Ups, no me habia dado cuenta...  :silbar:

De todas formas, si el proposito del vector es que funcione como cadena de caracteres, lo unico que tienes que hacer es asignar '\0' a la primera posicion. El resto son operaciones inutiles, ya que cualquier funcion de la libreria estandar de C considera el final de la cadena el primer caracter '\0', ignorando lo que venga despues. Por lo tanto estas haciendo 39 operaciones que no te sirven para nada.

Si el proposito del vector es otro, tendras que ver como inicializarlo para que contenga informacion consistente con respecto a las operaciones sucesivas.

¡Saludos!


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: Fire544 en 10 Agosto 2012, 20:49 pm
Si ahora si estas en lo correcto, jajaja demasiadas operaciones innecesarias !! Gracias por la aclaracion do-while !!  ;-)


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: BlackZeroX en 10 Agosto 2012, 23:19 pm
BlackZeroX (Astaroth) Comprendo, tienes razon, luego se producirian errores logicos, pero mira esta seria una buena correccion !!

Código
  1. printf("Named Server: ");
  2.    gets(ip);
  3.  
  4.    if(strlen(ip)>=15) //comprobamos que nuestro vector no este al limite de caracteres
  5.    {return 1;} //tambien puedes devolver un mensaje avisando de la falta de espacio
  6.  

Estas errado, lo mejor es usar una función QUE limite esto... es por ello que en el código que yo publique use fgets(), checa-lo...

Dulces Lunas!¡.


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: Fire544 en 11 Agosto 2012, 05:03 am
Estas errado, lo mejor es usar una función QUE limite esto... es por ello que en el código que yo publique use fgets(), checa-lo...

Dulces Lunas!¡.

Si comprendo, tienes mucha razon, y claro entiendo el uso de fgets(); en tu codigo, pero opte por desarrollar mi codigo con esta logistica ya que  Dryken no queria eso, pero a ver que dice el ahora !!! Gracias BlackZeroX (Astaroth) ;-)


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: s00rk en 11 Agosto 2012, 08:03 am

Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. int main(){
  8.   char puerto[25], ip[25], netcat[80];
  9.  
  10.   cout << "Introduce la IP: "<< endl;
  11.   cin >> ip;
  12.   cout << "Introduce el puerto: " << endl;
  13.   cin >> puerto;
  14.  
  15.   sprintf(netcat, "nc %s %s", ip, puerto);
  16.   system(netcat);  
  17.   cin.getch();
  18.   return 0;
  19. }


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: BlackZeroX en 11 Agosto 2012, 08:06 am
.
Si no me equivoco usar cin  con un array de char es lo mismo que usar gets() con el array char (corrijan-me)... lo mejor seria usar el tipo string si se esta en C++.

Código
  1.  
  2. int main(){
  3.   string puerto,
  4.          ip,
  5.          netcat;
  6.  
  7.   cout << "Introduce la IP: ";
  8.   cin >> ip;
  9.   cout << "Introduce el puerto: ";
  10.   cin >> puerto;
  11.   netcat = "nc " + ip + " " + puerto;
  12.   system(netcat);  
  13.   cin.getch();
  14.   return 0;
  15. }
  16.  
  17.  

Dulces Lunas!¡.


Título: Re: [DUDA] añadir espacios al utilizar la función strcat
Publicado por: rir3760 en 11 Agosto 2012, 16:28 pm
Si no me equivoco usar cin  con un array de char es lo mismo que usar gets() con el array char (corrijan-me)... lo mejor seria usar el tipo string si se esta en C++.
Es correcto.

En el sitio C Plus Plus (http://www.cplusplus.com/reference/iostream/istream/operator%3E%3E/) se describe en detalle el operador "<<", la sección que nos incumbe:
Citar
Extracts characters and stores them as a c-string (i.e. in successive locations starting at location pointed by str and terminated by a null-character). Extraction ends when the next character is either a valid whitespace or a null character, or if the End-Of-File is reached. The terminating null character is automatically appended after the extracted characters.

The extraction operation can be limited to a certain number of characters (thus avoiding the possibility of buffer overflow) if the field width (which can be set with ios_base::width or setw) is set to a value greater than zero. In this case, the extraction ends one character before the count of characters extracted reaches the value of field width, leaving space for the ending null character. After a call to this extraction operation the value of the field width is automatically reset to zero.

Un saludo