/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Bugs C++

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
v0x1



Registrado: 20 Oct 2007
Mensajes: 13

MensajePublicado: 24/10/2007 6:29 pm
Título: Bugs C++

Hola que tal escribo este post ya que me surgio curiosidad respecto a un tema que vendria siendo algo asi como seguridad en software. La otra ocasion hize un programa que pide un user y pass , aqui dejo el codigo por si acaso :

Código:

#include <iostream>
#include <string.h>
int main()
{
    using namespace std;
    char pass[10] = "s0l1d";
    char user[6] = "r00t";
    char usr[30];
    char pss[30];
   
    cout << "User : ";
    cin >> usr;
    cout << "Password : ";
    cin >> pss;
   
    if(strcmp (usr, user) == 0)
    {
              if(strcmp (pass, pss) == 0)
              {
                cout << "Correct login !" << endl;
                getchar();
                system("cls");
                cout << "#---------------------" << endl;
                cout << "# Welcome Root        " << endl;
                cout << "#---------------------" << endl;
                getchar();
              }

    }
    else
    {
        cout << "Incorrect Login !" << endl;
        getchar();
    }
   
    return 0;
}


Lo que pasa es que al compilarlo quize ver si de alguna forma se podia obtener el user y password sin realmente saberlo asi que se me ocurrio abrirlo con un debugger realmente no lo se manejar del todo y no lo encontre asi que decidi abrirlo con un editor hexadecimal ( HexWorks ) y resulta que ahi esta el user y pass sin ninguna traba , simplemente en texto plano.



Ahi esta una pic del momento en el que descubri que realmente no se necesita saber los datos para acceder al programa. Me gustaria saber

- ¿ Como se podria evitar este tipo de problema ?
- ¿ Como y porque sucede esto ?


Saludos y Gracias de antemano.
Volver arriba
daltomi



Registrado: 28 Abr 2007
Mensajes: 114
Ubicación: Argentina

MensajePublicado: 24/10/2007 9:21 pm
Título:

Es que la clave no debe estar en el binario, sino que dado un valor como entrada del programa(clave), éste, con alguna función resumen,SHA-1 por ejemplo, se puede determinar si el valor devuelto corresponde a una constante que si se encuentra dentro del binario.

Ideas.....

Utilizando 2 programas, el primero es privado, sólo lo tienes tú y sirve para obtener el valor de la función resumen, el otro no está compilado todavía.
Cita:

Prototipo del programa privado(modo consola):
prog_privado(strClave string);

Ejecutamos el programa privado:
prog_privado "r4hc5&22 estudio contable"

Retorna un valor: B91DAAB1034155ED42264A47D7FEFABD0342D05E <- valor real, recien lo obtuve.

Código fuente del programa público(fragmento),ingresamos ese valor:
...
const UI32 lngComp = B91DAAB1034155ED42264A47D7FEFABD0342D05E <- será visto por todos.
...

La unica manera que se repita éste valor será ingresando la clave por parte del usuario.

Otra variante es crear un archivo como base de datos el cuál contenga 2 valores bien diferenciados por nosotros:
Ejemplo:
B91DAAB1034155ED42264A47D7FEFABD0342D05E <- corresponde a la clave
FC79144D081E374F882196857C6D8F93A8090A28 <- corresponde a el programa público.

En éste caso leemos el contenido del archivo(si no existe damos por terminado el programa). y ejecutamos la función resumen sobre el mismo binario público(es decir sobre si mismo - archivo.exe) y si es válida la comparación, procedemos a pedir al usuario que ingrese su clave, observmos si corresponde el resultado de la función resumen con el valor de la base de datos.

Todo esto no es muy seguro, pero sería un concepto lo más básico para tener algo de seguridad, digo que esto no es seguro porque se lo puede franquear facilmente, ya que todo se basa en comparaciones y saltos. En la Red hay mucho material de como "complicar las cosas" para evitar a los crakers.
Por cierto, en la sección códigos, se encuentra mi implementación que acabo de utilizar para dar estos valores, se llama Algoritmo SHA-1, pero tiene un pequeño error, dejaré un comentario para corregirlo.

Saludos.
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1372
Ubicación: En ecx esperando un call

MensajePublicado: 25/10/2007 3:18 am
Título: Re: Bugs C++

v0x1 escribió:
- ¿ Como y porque sucede esto ?.


En estas declaraciones:
Código:

char pass[10] = "s0l1d";
char user[6] = "r00t";


Tanto la cadena "s0l1d" como "r00t" son arrays de char con categoria de almacenamiento estatico, los arrays pass y user se inicializaran en la pila con cada uno de los elementos de las cadenas mencionadas, estas cadenas por tanto permanecen en el binario de forma constante .

Una forma, (como practica de programación) es setear los array pasando los datos desde ficheros o librerias de enlace dinamico, para darle mayor complejidad estos datos podrian estar cifrados con algun algoritmo de los muchos que polulan por la red.



S2.
_________________
- Explícito es mejor que implícito.
- Simple es mejor que complejo.
- Complejo es mejor que complicado.
- Plano es mejor que anidado.
- Ralo es mejor que denso.
Volver arriba
v0x1



Registrado: 20 Oct 2007
Mensajes: 13

MensajePublicado: 25/10/2007 2:06 pm
Título:

Gracias.

Prescisamente eso iva a preguntar , si existia un metodo en C++ para encriptar en md5 o quiza en sha-1 ya que es mas fuerte por los salteos y demas.

Saludos
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com