PDA

Visualizza la versione completa : [C++] Algoritmo di simulazione "forza bruta"


JohnConnor
03-08-2011, 20:40
Ciao a tutti!! è da un paio di giorni che sto provando a realizzare un piccolo programma in C++ che sia in grado di effettuare un attacco di forza bruta... :cry:
L'ho stavo impostando in modo da avere due array di tipo char di dimensione 8 chiamati uno password e uno crack.
Parto con l'acquisizione della password, poi inizializzo l'array crack con tutti i caratteri che contengano lo zero ASCII (il valore NULL per capirci) in questo modo si potrebbe trovare una qualsiasi parola composta con il codice ASCII da 0 a 255.
Fino a qui ci sono, ma mi blocco :dhò: :dhò: appena devo fare il controllo perchè lo voglio fare trattandole come due stringhe --> (strcmp(password,crack)==0) e non carattere per carattere (cosa che già sono riuscito a fare...)..... :)
Lo volevo realizzare possibilmente con una funzione ricorsiva in modo tale che anche se aumento o diminuisco la lunghezza della stringa da "craccare" , per così dire, il programma funzioni ugualmente. :mem:
Ho già cercato sul web ma ho trovato solamente sorgenti che utilizzavano cicli for annidati ma avevano il difetto di non poter aumentare la dimensione della stringa.... :nonono:
Riassumendo:
-utilizzare tutti i 256 caratteri ASCII
-possibilmente funzione ricorsiva
-controllo tra stringhe (NON carattere per carattere)

Come lo realizzereste?? quello che mi interessa di + è la funzione ricorsiva... :mem: :mem:
Comunque qualsiasi consiglio e suggerimento è molto gradito!! :D

oregon
03-08-2011, 22:01
Non ho compreso il perché della funzione ricorsiva ... se devi confrontare due zone di memoria, puoi utilizzare la funzione

memcmp

Non puoi utilizzare la strcmp perché non puoi trattare i caratteri NULL.


P.S. Diciamo che il quesito può essere di tipo *generale*, ma se esplicitamente riferito a discorsi come *crack*, allora non è benvenuto su questo forum ed è possibile che ti venga chiuso il thread (a giudizio dei moderatori) ...

valia
03-08-2011, 22:46
Originariamente inviato da oregon
Non ho compreso il perché della funzione ricorsiva ... se devi confrontare due zone di memoria, puoi utilizzare la funzione

memcmp

Non puoi utilizzare la strcmp perché non puoi trattare i caratteri NULL.


P.S. Diciamo che il quesito può essere di tipo *generale*, ma se esplicitamente riferito a discorsi come *crack*, allora non è benvenuto su questo forum ed è possibile che ti venga chiuso il thread (a giudizio dei moderatori) ...

Beh il mio prof di sicurezza ci fece fare degli esercizi di attacchi a forza bruta...spero si tratti di una situazione di questo tipo

JohnConnor
04-08-2011, 00:50
XD ho chiamato la variabile crack perchè non sapevo come chiamarla e dovendo fare un'esercitazione che provava tutte le possibili combinazioni come un attacco di forza bruta mi è sembrata appropriata!! XD cmq memcmp in quale libreria si trova? mi potete fare un esempio pratico di come posso effettuare il controllo?? :confused:
per rispondere a oregon: volevo utilizzare la funzione ricorsiva per avere un codice più piccolo e "pulito"... anche perchè credo che con i cicli for annidati ce la dovrei fare ma non mi piace perchè non posso superare il numero prestabilito di caratteri!

piccolo OFF topic
(state tranquilli sono troppo a terra di programmazione!! :messner: non riesco manco a formattare il mio PC per installare XP a 64bit! :dhò: XD)

Celebron
04-08-2011, 01:22
sta in string.h
http://www.cplusplus.com/reference/clibrary/cstring/memcmp/

oregon
04-08-2011, 08:46
Originariamente inviato da JohnConnor
per rispondere a oregon: volevo utilizzare la funzione ricorsiva per avere un codice più piccolo e "pulito"... anche perchè credo che con i cicli for annidati ce la dovrei fare ma non mi piace perchè non posso superare il numero prestabilito di caratteri!

Un attimo ... hai detto "mi blocco appena devo fare il controllo" ... quindi ho capito che volessi effettuare il check della password appena generata con una funzione ricorsiva ...

La funzione ricorsiva, invece, la vorresti utilizzare per "generare" la password non per "controllarla" ... ho capito bene?

JohnConnor
04-08-2011, 14:48
ogni volta che genera una nuova combinazione effettuare il controllo( il tuttto all'interno del ciclo for): se è uguale uscire dalla funzione perchè è stata trovata, se no continuare!

oregon
04-08-2011, 14:54
Originariamente inviato da JohnConnor
ogni volta che genera una nuova combinazione effettuare il controllo( il tuttto all'interno del ciclo for): se è uguale uscire dalla funzione perchè è stata trovata, se no continuare!

Non mi hai risposto ... la funzione ricorsiva è per

"generare una nuova combinazione"

oppure

"effettuare il controllo"

?

A prescindere da tutto, tu come lo faresti? Cosa scriveresti?

JohnConnor
04-08-2011, 17:11
Grazie celebron per memcmp!! :ciauz:

La funziona ricorsiva è sia per generare la combinazione che per effettuare il controllo!!
io avevo in mente una cosa del genere:

//(il vettore crack già inizializzato con tutti carartteri NULL)
void attacco (char password[],char crack[],int lpass)
{


for(int i=0;i<lpass;i++){
for(int j=0;j<=255;j++){
//controllo (se crack è diverso da password:
// crack[i]++;
// se crack è uguale a password chiudere il ciclo)
if (crack[i]==255) attacco(password[],crack[],lpass);
}
}
}

ecco pensavo ad una cosa del genere.... so già che quello che ho scritto sopra è un ammasso di stupidaggini ma + o - è quello che mi è venuto in testa fino ad ora!! :dhò:


Questo codice (sotto) invece funziona anche se con qualche carattere particolare non va bene (sicuramente perchè non uso memcmp) ma fa il confronto tra caratteri della stessa posizione finchè non trova quello uguale e poi passa avanti, finchè non finisce la lunghezza della stringa.


void hackpass(char password[],char temp)
{
//adesso verrà trovata la password precedentemente inserita procedendo con un sistema di forza bruta, provando cioè tutte le possibili combinazioni!
int lpass=strlen(password);
for(int i=0;i<lpass;i++){
for(int j=0;j<=password[i];j++){
if (j==password[i]){
cout<<(char(j));
temp[i]=j;
}
}
}
}

:messner:

JohnConnor
10-08-2011, 17:08
Ragazzi ho scritto questo programmino... è combinato un pò meglio di quello che avevo postato precedentemente ma comunque non funziona perchè se ne va in loop stampando eresie! XD


#include <iostream>
#include <string.h>
#include <conio.h>
using namespace std;


int main()
{
char pass[20],hack[20];
int lpass,ceck;
for(int j=0;j<21;j++){
hack[j]==(char(0));
}
for(int j=0;j<21;j++){
pass[j]==(char(0));
}
cout<<"Inserisci la password:";
cin>>pass;
lpass=strlen(pass);



do{
int i=0;
ceck=memcmp(pass,hack,lpass);
if (ceck==0){cout<<"La password e' stata trovata:"<<hack;}
else{
if (hack[i]<255){hack[i]=(char(0));}
else{
while(hack[i]==(char(255))){
hack[i]=(char(0));
hack[i+1]++;
i++;
}
}
}
}while(ceck=!0);
getch();
return 0;
}

l'ho compilato con dev-c++ versione 4.9.9.2, ed alla riga 28 mi dà questo errore:"[Warning] comparison is always true due to limited range of data type"....... mi spiegate che vuol dire??

Loading