Ayuda en un programa de c++ uso del strcmp :)

Iniciado por SilverStun, 3 Noviembre 2014, 03:43 AM

0 Miembros y 1 Visitante están viendo este tema.

SilverStun

Buenas noches espero se encuentren bien si alguien me pudiera ayudar con esto aquí mi código fuente :


# include <conio.h>
# include <stdio.h>
# include <stdlib.h>
# include <iostream.h>
# include <dos.h>
# include <string.h>
void leerPasw(char frase[])
{
    int i=0;
    cout.flush();
    char a;
    int b=232;
    a=b;
    do
    {
        frase = (unsigned char)getch();

        if(frase!=8)  // no es retroceso
        {
            cout << ""<<a<<"";  // muestra por pantalla
            i++;
        }
        else if(i>0)    // es retroceso y hay caracteres
        {
            cout << (char)8 << (char)32 << (char)8;
            i--;  //el caracter a borrar e el backspace
        }
        cout.flush();

    }while(frase[i-1]!=13);  // si presiona ENTER

    frase[i-1] = NULL;

    cout <<"\n";
}

int fo1=177,fo9=178;
int fo2=163,fo3=162,fo10=164;
int fo4=201,fo5=205,fo6=187,fo7=188,fo8=200;
int main ()
{
char Usuario[16];
char Pass[16];
textbackground(WHITE); clrscr();
gotoxy(8,1);textcolor(BLUE);cprintf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1);
gotoxy(8,2);textcolor(BLUE);cprintf("%c                                                                %c",fo1,fo1);
gotoxy(8,3);textcolor(BLUE);cprintf("%c                  Rep%cblica Bolivariana de Venezuela            %c",fo1,fo2,fo1);
gotoxy(8,4);textcolor(BLUE);cprintf("%c            Ministerio del Poder Popular para la Defensa        %c",fo1,fo1);
gotoxy(8,5);textcolor(BLUE);cprintf("%c Universidad Nacional Experimental de la Fuerza Armada Nacional %c",fo1,fo1);
gotoxy(8,6);textcolor(BLUE);cprintf("%c                Decanato de Investigaci%cn y Postgrado           %c",fo1,fo3,fo1);
gotoxy(8,7);textcolor(BLUE);cprintf("%c                        N%ccleo Los Teques                       %c",fo1,fo2,fo1);
gotoxy(8,8);textcolor(BLUE);cprintf("%c                                                                %c",fo1,fo1);
gotoxy(8,9);textcolor(BLUE);cprintf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1,fo1);

gotoxy(38,11);textcolor(BLUE);cprintf("%c%c%c%c%c",fo4,fo5,fo5,fo5,fo6);
gotoxy(35,12);textcolor(BLUE);cprintf("%c%c%c%c E %c%c%c%c",fo4,fo5,fo5,fo7,fo8,fo5,fo5,fo6);
gotoxy(32,13);textcolor(BLUE);cprintf("%c%c%c%c N     F %c%c%c%c",fo4,fo5,fo5,fo7,fo8,fo5,fo5,fo6);
gotoxy(29,14);textcolor(BLUE);cprintf("%c%c%c%c U           A %c%c%c%c",fo4,fo5,fo5,fo7,fo8,fo5,fo5,fo6);
gotoxy(29,15);textcolor(BLUE);cprintf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",fo8,fo5,fo5,fo5,fo5,fo5,fo5,fo5,fo5,fo5,fo5,fo5,fo5,fo5,fo5,fo5,fo5,fo5,fo5,fo5,fo5,fo5,fo7);
gotoxy(26,17);textcolor(BLUE);cprintf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9);
gotoxy(26,18);textcolor(BLUE);cprintf("%c  Operador:                 %c",fo9,fo9);
gotoxy(26,19);textcolor(BLUE);cprintf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9);
gotoxy(40,18);scanf("%c",&Usuario);
gotoxy(26,22);textcolor(BLUE);cprintf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9);
gotoxy(26,23);textcolor(BLUE);cprintf("%c  Contrase%ca:               %c",fo9,fo10,fo9);
gotoxy(26,24);textcolor(BLUE);cprintf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9,fo9);
gotoxy(41,23);leerPasw(Pass);


  if(strcmp(Usuario,"Administrador") == 0 && strcmp(Pass,"stun")==0)
   {
   cout << "\n\nUsuario Acertado" << endl;
   }
else
   {
    cout << "\n\nUsuario o Contrasena incorrecta, por favor verifique" << endl;
   }

system("pause > null");

return 0;

}


mi duda es por que no me acepta la parte del strcmp gracias de antemano :)


crack81

si estas usando c++ porque no usas string en vez de arreglos de caracter creo es mas apropiado
la verdad no entiendo porque no te anda el strcmp a mi anduvo bien

si me haces caso en utilizar string
solo has un pequeño cambio al comparar cadenas, utilizando la funcion c_str()
porque como strcmp es de c no acepta el objeto string y se tiene que hacer un pequeño casteo


como en este ejemplo:
#include<iostream>
#include <cstring>
using namespace std;


int main(){

   string Usuario="Administrador";
   string Pass="stun";

   if(strcmp(Usuario.c_str(),"Administrador") == 0 && strcmp(Pass.c_str(),"stun")==0)
   {
         cout << "\n\nUsuario Acertado" << endl;
   }
   else
   {
          cout << "\n\nUsuario o Contrasena incorrecta, por favor verifique" << endl;
   }




cin.get();
cin.get();
return 0;}
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

leosansan

#2
Cita de: SilverStun en  3 Noviembre 2014, 03:43 AM

mi duda es por que no me acepta la parte del strcmp gracias de antemano :)


En principio funciona bien, como indica crack81. Eso sí, tienes que ajustar las librerías que en C++ no llevan .h e incluir el using:

Código (cpp) [Seleccionar]
#include <iostream>
# include <conio.h>
# include <cstdio>
# include <cstdlib>
# include <cstring>

using namespace std;


En todo caso dirá, tal como lo tenias, entrada incorrecta porque a la variable usuario no le das entrada, a no ser, tal como hizo crack81 que la declares antes.

Y ya que usas conio.h te puedes ahorrar el uso de dos.h para system cambiando ésta por getch, aunque lo que proceda es no usar la librería conio y sus funciones por no ser parte del estándar de C/C++.

Y sii como indica crack81 usas string has de incluir #include <string> en lugar de #include <cstring> y la comparación puede ser directa, sin el uso de strcmp:

Código (cpp) [Seleccionar]
if(Usuario=="Administrador" && Pass=="stun")

¡¡¡¡ Saluditos! ..... !!!!



SilverStun

Muchas gracias ya pruebo a ver cualquier cosa les digo ya lo voy a intentar
:P

dRak0

Si utilizas ese codigo tendras muy poca seguridad.Solo bastara con analizar los strings del binario y hacer fuerza bruta al pass.Podrian depurar la aplicacion frenar en el strcmp y devolverle true y listo.


eferion

Cita de: L0RdP3I en  3 Noviembre 2014, 13:21 PM
Si utilizas ese codigo tendras muy poca seguridad.Solo bastara con analizar los strings del binario y hacer fuerza bruta al pass.Podrian depurar la aplicacion frenar en el strcmp y devolverle true y listo.

¿Y qué propones para evitar eso? Al final la decisión sobre si un acceso es válido o no la toma un salto condicional en ensamblador... cambiar ese código por su opuesto ( o cambiarlo por un salto incondicional) revienta totalmente el chequeo de usuario y contraseña.

dRak0

#6
Hacer todo lo posible para que no se encuentre ese salto.No soy un experto en ingenieria inversa , ni mucho menos en seguridad orientada a la defensa.
Lo primero que se me viene a la mente es:
Utilizar criptografia.
Añadir un packer.
Tecnicas anti-debugging.
Remover strings del binario.
Tratar de usar funciones que no son muy conocidas.Creo que lo primero que van a buscar es strcmp.

En fin como decis vos , siempre se va a poder.El tema es complicar un poco.