Gå til innhold

Hjelp til feilsøking av en liten kodesnutt.


Anbefalte innlegg

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 :p 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 av Zethyr
Lenke til kommentar
Videoannonse
Annonse

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

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 :p

Noen som ser en umiddelbar feil?

Endret av Zethyr
Lenke til kommentar

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

Når man definerer størrelsen og indexerer en arry(litt usikker på den oversettelsen der :p), 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! :w00t:

Endret av zirener
Lenke til kommentar
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 av Nazgul
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...