Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Dr. H47 en 9 Enero 2011, 05:43 am



Título: Simulando una clave de acceso en C++
Publicado por: Dr. H47 en 9 Enero 2011, 05:43 am
- Aqui les dejo un pequeño código fuente codificado en ´lenguaje c++.

Código que simula una clave de acceso mediante do…while y define.

- Si no se ingresa la clave correcta el programa no da acceso y pide ingresar la clave cuantas veces sea necesario.

- La clave ha sido declarada en una variable tipo entero (int), por lo que si se ingresa una letra o caracter que no sea numerico, la aplicación sale de su ciclo provocando un error infinito.


Código
  1. // ----------------------------
  2. // DENEGADO.CPP
  3. // Escrito en Turbo C++ 3.0
  4. // Programa que restringe el acceso, si no se teclea la clave correcta.
  5. // utilizando "do..while" y "define".
  6. // ----------------------------
  7.  
  8. #include <iostream.h>
  9. #include <conio.h>
  10.  
  11. #define clavetrue 777
  12.  
  13. int claveacceso;
  14.  
  15. void main (void)
  16. {
  17. clrscr();
  18. do
  19. {
  20. cout<<"Ingrese la clave de acceso: ";
  21. cin>>claveacceso;
  22. if (claveacceso != clavetrue);
  23. }
  24. while (claveacceso != clavetrue);
  25. cout<<"\n\nAcceso concedido.";
  26. getch();
  27. }
  28.  
  29. // Eder A. Lopez
  30. // dr.h47@live.com.mx
  31. // Powered by Dr. H47
  32.  

Ver el código fuente (http://www.whitesec.com.mx/src/denegado.txt) en texto plano.

Bajar source+ejecutable (http://www.whitesec.com.mx/src/Denegado.zip) comprimido en .zip


Título: Re: Simulando una clave de acceso en C++
Publicado por: Edu en 9 Enero 2011, 20:36 pm
Jajaja buen codigo, felicitaciones


Título: Re: Simulando una clave de acceso en C++
Publicado por: тαптяα en 9 Enero 2011, 21:04 pm
Siempre decepcionando ZERO...

Esta bien la idea, pero te falla el uso de conio.h es una libreria antigua, bueno lo de siempre, leete esto.

http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html




Título: Re: Simulando una clave de acceso en C++
Publicado por: Littlehorse en 10 Enero 2011, 19:14 pm
Sumado a que no es recomendable utilizar conio, "main" debe declararse "int main". La declaración de "iostream.h" es obsoleta, debe declararse "iostream". Cuidado con las variables globales innecesarias; son una mala practica.

Por otro lado, el código es bastante inseguro:

1) La forma en la que implementas el valor correcto es insegura. Es fácilmente accesible ya sea leyendo el proceso o debuggeando el ejecutable.

2) No limitas los intentos, por lo tanto en ultima instancia se podría hacer fuerza bruta.

Saludos



Título: Re: Simulando una clave de acceso en C++
Publicado por: Dr. H47 en 27 Enero 2011, 03:40 am
Gracias por el aviso, servira para tomarlo en cuenta en mis otras practicas.

Saludos.


Título: Re: Simulando una clave de acceso en C++
Publicado por: .mokk. en 27 Enero 2011, 09:27 am
Pues si he visto el codigo y veo algo que no entiendo aun, porque un if dentro del do while de comparacion que no hace nada ? hehe

Sobre el codigo aqui te lo dejo un poco mejorado, acepta letras pero mostrara mensaje diciendo que solo numeros, por lo que es mejor asi tu programa no crashea, bueno aqui te dejo el codigo y tambien leido lo de LittleHorse intente hacerlo de la mejor forma posible

Código
  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. #define clavetrue 777
  7.  
  8. int claveacceso, intento=0, total = 5;
  9. char buffer[100];
  10.  
  11. int main(int argc, char *argv[])
  12. {
  13.     do
  14.     {
  15.      if(intento>total) {
  16.                     cout << "Has sobrepasado el numero de intentos disponibles el programa cerrara";
  17.                     cin.get();
  18.                     return 0;
  19.                        }
  20.  
  21.  
  22.      cout<<"Ingrese la clave de acceso: ";
  23.      fgets(buffer, 99, stdin);
  24.      if(sscanf(buffer, "%d", &claveacceso) != 1)
  25.                        cout << "Error solo numeros porfavor" << endl;
  26.  
  27.  
  28.  
  29.      if(claveacceso != clavetrue)
  30.                     cout<<"Intento numero: " << intento << " - Intentos restantes: " << (total-intento) << endl;
  31.      intento++;
  32.     }
  33.     while (claveacceso != clavetrue);
  34.     cout<<"\n\nAcceso concedido.";
  35.     cin.get();
  36. }
  37.  


1) La forma en la que implementas el valor correcto es insegura. Es fácilmente accesible ya sea leyendo el proceso o debuggeando el ejecutable.


He visto este tema en el cual nose si sea buenoa forma de asegurar mejor nuestra contraseña,
http://gaussianos.com/criptografia-cifrado-de-clave-publica-ii/
Ahi tambien si podrias dar alguna sugerencia en eso seria de gran ayuda mas para proyectos en los que deceemos usar una contraseña y sea mas dificil el poder crackear el programa.


Título: Re: Simulando una clave de acceso en C++
Publicado por: Littlehorse en 27 Enero 2011, 17:25 pm
Es un tema bastante amplio, se pueden hacer muchas cosas. Ofuscar el código agregando operaciones basura, packers, ofuscación mediante VM (http://recon.cx/2008/a/craig_smith/Neohapsis-VM-101.pdf), cifrados (https://foro.elhacker.net/criptografia-b56.0/) de distintos tipos para el password etc.

Realmente depende del propósito principal del programa (si realiza o no conexiones) pero la regla básica es no almacenar la contraseña en texto plano en ningún lugar del sistema.

En el caso del código, al utilizar un define le pones la tarea muy facil al que debuggea ya que puede ver el valor de la constante a comparar muy fácilmente. Es decir vería algo similar a:

Código
  1. cmp [xxxxxx],00000309

donde 309 en hexadecimal es 777 en decimal.

Saludos


Título: Re: Simulando una clave de acceso en C++
Publicado por: Garfield07 en 27 Enero 2011, 19:02 pm
Código
  1. /*
  2. Eder A. Lopez
  3. dr.h47@live.com.mx
  4. Powered by Dr. H47
  5. ++++++++++++
  6. Code in C : Sagrini 2010 : elhacker.net
  7. */
  8. #include <stdio.h>
  9.  
  10. int main (int argc, char *argv [])
  11. {
  12. int clave, OK = atoi (argv [1]);
  13. do
  14. {
  15. printf( "Ingrese la clave de acceso: ");
  16. scanf ("%d", &clave);
  17. }
  18. while (clave != OK)
  19. printf ("Acceso concedido !!!\n\n");
  20. return 0;
  21. }
  22.  

He visto este tema en el cual nose si sea buenoa forma de asegurar mejor nuestra contraseña,
http://gaussianos.com/criptografia-cifrado-de-clave-publica-ii/
Pues no, eso es para otra cosa  :P. Criptografía, comunicaciones seguras, pero se podría usar algo como
Código
  1. #define OK 111*7
Evidentemente más entrevesado, para liar a un atacante inexperto...
Otra forma sería guardar la pass en un archivo con privilegios unicamente del que ejecuta el prog... Hay formas de sobra, solo es pensar.

Es un tema bastante amplio, se pueden hacer muchas cosas. Ofuscar el código agregando operaciones basura, packers, ofuscación mediante VM (http://recon.cx/2008/a/craig_smith/Neohapsis-VM-101.pdf), cifrados (https://foro.elhacker.net/criptografia-b56.0/) de distintos tipos para el password etc.
Realmente depende del propósito principal del programa (si realiza o no conexiones) pero la regla básica es no almacenar la contraseña en texto plano en ningún lugar del sistema.
En el caso del código, al utilizar un define le pones la tarea muy facil al que debuggea ya que puede ver el valor de la constante a comparar muy fácilmente. Es decir vería algo similar a:
Código
  1. cmp [xxxxxx],00000309
donde 309 en hexadecimal es 777 en decimal.
Saludos
De acuerdo, mucho mejor jeje... Ahí esta lo de arriba...

Sumado a que no es recomendable utilizar conio, "main" debe declararse "int main". La declaración de "iostream.h" es obsoleta, debe declararse "iostream". Cuidado con las variables globales innecesarias; son una mala practica.
Por otro lado, el código es bastante inseguro:
1) La forma en la que implementas el valor correcto es insegura. Es fácilmente accesible ya sea leyendo el proceso o debuggeando el ejecutable.
2) No limitas los intentos, por lo tanto en ultima instancia se podría hacer fuerza bruta.
Saludos
Lo de la fuerza bruta se podría hacer de todas formas, solo ejecutar varias veces el programa, aunque sería más lento evidentemente...
Lo demás que se dice en el code...
http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

Suerte!