Zethyr Skrevet 30. november 2005 Rapporter Del Skrevet 30. november 2005 (endret) For å forklare situasjonen; jeg har funnet en algortime som sjekker passordet i en crackme, men den er en ganske snill algoritme, så jeg jeg har fått i oppgave å finne det spesielle passordet som har md5-hashen som står 4 linjer nede i koden. Programmet kompilerer, men krasjer. Debugging er jeg ikke så god på, men jeg prøver og prøver Har noen et tips om hva som kan være feil her? #include "md5.h" #include "md5.c" //96c4dda0c4a0b34262b1d91d47056f9e int main(){ MD5 md5; char buffer[6]; char correcthash[] = "96c4dda0c4a0b34262b1d91d47056f9e"; unsigned char digest[16]; int length = 6; char i = 0x7f, j = 0x7f, k = 0x7f; MD5Open(&md5); while((strncmp(md5.buffer, correcthash, 32) == 0)){ if(--i < 0x30){ i = 0x7f; --j; } if(--j < 0x30){ j = 0x7f; --k; } if(k < 0x30){ break; } buffer[0] = i; buffer[1] = j; buffer[2] = k; buffer[3] = (0xd4 - k); buffer[4] = (0xd1 - j); buffer[5] = (0xde - i); MD5Digest(&md5, buffer, length); } printf("%s\n", digest); getch(); MD5Close(&md5, digest); return 1; } Endret 1. desember 2005 av Zethyr Lenke til kommentar
JBlack Skrevet 1. desember 2005 Rapporter Del Skrevet 1. desember 2005 Hmm... Noen kjappe tanker: Ikke inkluder md5.c. Kompiler den inn i stedet. Bruk strncmp slik at du ikke risikerer å lese utenfor minneområdet Hvorfor er i integer når du caster den til char når du bruker den? Hva er buffer[0] ? Hvorfor har ikke length noen verdi? Sikker på at printf ikke bør skrive ut md5.buffer i stedet for md5? Lenke til kommentar
Zethyr Skrevet 1. desember 2005 Forfatter Rapporter Del Skrevet 1. desember 2005 (endret) Er enig i de første tingene du sier, mye smart der.. Er litt usikker på hvordan det bil gå dersom printf skriver ut md5, siden dette er en struct. Men det jeg er usikker på er, er om den kanskje heller skulle skrive ut digest. edit; har nå oppdatert koden i første post, hvor jeg tar hensyn til en del av det du sier. Koden kjører (krasjer ikke), men jeg tror feilen ligger i at jeg ikke har fattet 100% hva den md5-algoritmen gjør Noen som ser en umiddelbar feil? Endret 1. desember 2005 av Zethyr Lenke til kommentar
kimla Skrevet 5. desember 2005 Rapporter Del Skrevet 5. desember 2005 Nå har ikke jeg så altfor greie på programmering da, så kan hende jeg er helt på viddene men: while((strncmp(md5.buffer, correcthash, 32) == 0)){ når man mekker array så må man vel ha de [] tegnene på variablene også? som i buffer[] og correcthash[] ? Eller er jeg helt på viddene.. ? Lenke til kommentar
Dead_Rabbit Skrevet 5. desember 2005 Rapporter Del Skrevet 5. desember 2005 (endret) Når man definerer størrelsen og indexerer en arry(litt usikker på den oversettelsen der ), så trenger du å ha med klammene. Men når du sender arryen som argument til en funksjon, trenger du ikke dette. F.eks. hvis vi ser på denne programsnutten: #include <iostream> using namespace std; int increase(int arry[], int index) { return arry[index]+=10;; } int main(int argc, char* argv[]) { int iarry[3] = { 10, 20, 30 }; //Her bruker vi klammer brukes for å definere arryens størrelse //evt. kunne man ha gjort: iarry[0] = 10; iarry[1] = 20; osv. cout << "Printing initial values:\n"; for(int j = 0; j != 3; ++j) cout << iarry[j] << endl; //Og for å indexere arryen cout << endl; cout << "Printing the new values:\n"; for(int i = 0; i != 3; ++i) cout << increase(iarry, i) << endl; //Men ikke når den er argument til en funksjon return 0; } Edit: Merkelig formatering Edut2: Innlegg nummer 700! Endret 5. desember 2005 av zirener Lenke til kommentar
Peter Skrevet 5. desember 2005 Rapporter Del Skrevet 5. desember 2005 (endret) Nå har ikke jeg så altfor greie på programmering da, så kan hende jeg er helt på viddene men: while((strncmp(md5.buffer, correcthash, 32) == 0)){ når man mekker array så må man vel ha de [] tegnene på variablene også? som i buffer[] og correcthash[] ? Eller er jeg helt på viddene.. ? 5254861[/snapback] Langt ute er du ihvertfall. Du kan referere til et spesielt element i et array x[t] der 0 <= t < (sizeof(x)/sizeof(x[0])) Kort og godt, t må være mellom mellom størrelsen 0 og lengden på arrayet -1 int x[3]; x[0] = 0; x[1] = 10; x[2] = -50; char y[10]; strncpy(y, "mintekst", 10) /* Her kopierer jeg "mintekst" til y. strncpy() går igjennom hver og en av y[t] fra 0 til 9 (10-1), og legger inn tilsvarende bokstaver fra "mintekst". I dette tilfellet blir det: y[0] = 'm'; y[1] = 'i'; (...) y[7] = 't'; y[8] = '\0'; */ Alle char* strenger som er ascii termineres med en '\0' (null-byte) for å si at her slutter strengen. Det er fordi at, som i dette eksempelet, at char* kan være større enn faktisk nødvendig, og da må andre funksjoner vite hvor langt de skal lese i strengen uten å få "tilfeldige rester i minnet", også kjent som garbage. I eksempelet allokerer jeg plass til 9 bokstaver + '\0' = 10 (y[0]-y[9]), men bruker bare 8+'\0'=9 plasser. Dersom man jobber med binærverdier, er ikke dette like lett, fordi '\0' forekommer rett som det er i binære filer o.l. '\0' er det samme som en int x = 0, men ikke samme som en char* x = "0"; Det er fordi i en char* så er tallet null representert ved 0x30, mens i en int er det 0x00. Du kan se mer om dette på www.asciitable.com Endret 5. desember 2005 av Nazgul Lenke til kommentar
Dead_Rabbit Skrevet 5. desember 2005 Rapporter Del Skrevet 5. desember 2005 Forresten, Zethyr: Kan du ikke bytte ut arryene med std::string? Det eliminerer ofte de aller vanligste problemene i forbindelse med arryer, osv. Så kan du jo kalle std::string::c_str() når du trenger en char-arry. Lenke til kommentar
Zethyr Skrevet 8. desember 2005 Forfatter Rapporter Del Skrevet 8. desember 2005 Takk for alle tips. Jeg er såpass ute på viddene med det md5-funksjonssettet at jeg fant ut at det beste var å ta ibruk noe litt enklere, så jeg poster oppdatert kode om en dag eller to Har noe som virker halvveis her, nå sru. Lenke til kommentar
JBlack Skrevet 8. desember 2005 Rapporter Del Skrevet 8. desember 2005 Hvilket MD5 bibliotek er det du forsøker å bruke? Algoritmen funker forresten. I know da password. "s****k" Lenke til kommentar
Zethyr Skrevet 9. desember 2005 Forfatter Rapporter Del Skrevet 9. desember 2005 Du har løst den, altså? Hvilke endringer gjorde du? Jeg er litt nysgjerrig nå.. Lenke til kommentar
JBlack Skrevet 9. desember 2005 Rapporter Del Skrevet 9. desember 2005 Jeg skrev mitt eget program fra scratch, og brukte MD5 algoritme fra openssl. Derfor jeg spurte hvilket bilbiotek du har benyttet. Men basert på erfaringen ser jeg for meg to mulige feil du kan ha gjort. Den ene er at det er en mulighet for at md5 må resettes mellom hver bruk. Den andre er at md5.buffer muligens inneholder en binær representasjon av hash'en. Følgende kode kan brukes for å gjøre hash-strengen om til en binær versjon: string correcthash = "96c4dda0c4a0b34262b1d91d47056f9e"; //Converts an ascii hash string to a binary hash string int l=correcthash.length()/2; char *binhash = new unsigned char[l]; string::iterator si=correcthash.begin(); unsigned char t; for (int i=0;i<l;i++){ t=*si++; if ((t>='0') && (t<='9')) binhash[i] = 16*(t-'0'); else if ((t>='a') && (t<='f')) binhash[i] = 16*(t-'a'+10); else if ((t>='A') && (t<='F')) binhash[i] = 16*(t-'A'+10); else binhash[i]=0; //error t=*si++; if ((t>='0') && (t<='9')) binhash[i] += t-'0'; else if ((t>='a') && (t<='f')) binhash[i] += t-'a'+10; else if ((t>='A') && (t<='F')) binhash[i] += t-'A'+10; else binhash[i]=0; //error } Sikkert langt fra smarteste algoritmen, men den funkær. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå