Aprimi
Preparati per un po' di divertimento hacker! In questo post sul blog, ti mostreremo come entrare in un semplice file eseguibile C protetto con una password usando Ubuntu 20.04 LTS. Che tu sia appena agli inizi o un professionista esperto, questo tutorial ha qualcosa per tutti. È ora di mostrare quelle abilità informatiche!
Tutti i file utilizzati in questo tutorial possono essere trovati su GitHub qui . Puoi clonare il repository nel tuo ambiente locale per accedere ai file crittografati.
Per iniziare, possiamo eseguire il crackmefile per osservarne il comportamento navigando nella directory crackme e inserendo il seguente comando:
$ ./crackme
Access Denied
Il filecomando viene utilizzato per identificare il tipo di un file. Lo fa eseguendo una serie di test in un ordine specifico: test del filesystem , test del numero magico e test della lingua .
Questi test sono progettati per determinare il tipo di file in base al suo contenuto e ai metadati ad esso associati. Se desideri utilizzare il filecomando per identificare il tipo di un file specifico, puoi farlo eseguendo file [filename]nel tuo terminale. Per esempio:
$ file crackme
crackme: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=e06e0b0229279a69506925702a7f79e36bdc3eb2, not stripped
- Un file eseguibile progettato per essere eseguito su un sistema operativo Linux a 64 bit
- Compilato per l'architettura x86–64 e collegato dinamicamente, il che significa che si basa su librerie condivise per funzionare
- Interpretato dall'interprete /lib64/ld-linux-x86–64.so.2
- Costruito per GNU/Linux 2.6.24 e ha un identificatore univoco chiamato "BuildID"
- Non è stato rimosso, quindi contiene ancora informazioni di debug e simboli che possono essere utilizzati per l'analisi.
Vale anche la pena notare che ltracepuò essere utilizzato insieme ad altri strumenti come gdb( GNU Debugger ) per analizzare ulteriormente il comportamento del programma e potenzialmente decodificarlo che non useremo per questo tutorial.
Possiamo eseguire ltraceil file crack me inserendo il seguente comando:
$ ltrace ./crackme
__libc_start_main(0x40087d, 1, 0x7ffeef764458, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9) = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9) = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9) = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9) = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9) = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9) = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9) = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9) = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9) = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9) = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9) = -4
strncmp("USER=vagrant", "Passw0rd=", 9) = 5
strncmp("SHLVL=1", "Passw0rd=", 9) = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9) = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9) = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9) = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9) = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9) = -32
strncmp("DBUS_SESSION_BUS_ADDRESS=unix:pa"..., "Passw0rd=", 9) = -12
strncmp("SSH_TTY=/dev/pts/0", "Passw0rd=", 9) = 3
strncmp("OLDPWD=/home/vagrant/crackme_tut"..., "Passw0rd=", 9) = -1
strncmp("_=/usr/bin/ltrace", "Passw0rd=", 9) = 15
puts("Access Denied"Access Denied
) = 14
+++ exited (status 1) +++
PC: ALX
__libc_start_mainè una funzione che imposta l'ambiente di un programma e chiama la sua funzione principale. Accetta vari argomenti ed è fornito dalla libreria standard C ( libc ). Viene chiamato dalla funzione del punto di ingresso principale del programma.- Le righe che iniziano con
strncmpmostrano che il programma sta chiamando lastrncmpfunzione, che è una funzione che confronta un dato numero di caratteri (in questo caso, 9 caratteri) di due stringhe. Le stringhe confrontate sembrano essere varie variabili d'ambiente (es. "SHELL", "PWD", "LOGNAME", ecc.) e la stringa"Passw0rd=". Sembra che il programma stia controllando se una delle variabili d'ambiente inizia con la stringa"Passw0rd=". - La
putsfunzione viene chiamata alla fine con la stringa " Accesso negato ", che può indicare che il programma sta stampando questo messaggio se nessuna delle variabili d'ambiente inizia con"Passw0rd=".
Per impostare una variabile d'ambiente in Linux, possiamo usare il exportcomando nel terminale. Ad esempio, per impostare una variabile di ambiente denominata Passw0rdsu un valore di test, possiamo eseguire:
export Passw0rd=test
$ ltrace ./crackme
__libc_start_main(0x40087d, 1, 0x7fff085f1d38, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9) = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9) = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9) = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9) = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9) = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9) = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9) = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9) = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9) = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9) = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9) = -4
strncmp("USER=vagrant", "Passw0rd=", 9) = 5
strncmp("SHLVL=1", "Passw0rd=", 9) = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9) = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9) = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9) = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9) = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9) = -32
strncmp("Passw0rd=test", "Passw0rd=", 9) = 0
MD5_Init(0x7fff085f1b90, 0x400b06, 9, 6) = 1
strlen("test") = 4
MD5_Update(0x7fff085f1b90, 0x7fff085f2f68, 4, 0x7fff085f2f68) = 1
MD5_Final(0x7fff085f1bf0, 0x7fff085f1b90, 0x7fff085f1b90, 0) = 1
sprintf("09", "%02x", 0x9) = 2
sprintf("8f", "%02x", 0x8f) = 2
sprintf("6b", "%02x", 0x6b) = 2
sprintf("cd", "%02x", 0xcd) = 2
sprintf("46", "%02x", 0x46) = 2
sprintf("21", "%02x", 0x21) = 2
sprintf("d3", "%02x", 0xd3) = 2
sprintf("73", "%02x", 0x73) = 2
sprintf("ca", "%02x", 0xca) = 2
sprintf("de", "%02x", 0xde) = 2
sprintf("4e", "%02x", 0x4e) = 2
sprintf("83", "%02x", 0x83) = 2
sprintf("26", "%02x", 0x26) = 2
sprintf("27", "%02x", 0x27) = 2
sprintf("b4", "%02x", 0xb4) = 2
sprintf("f6", "%02x", 0xf6) = 2
strcmp("c4032d9e95a93d91b9b595dcfcca640b"..., "098f6bcd4621d373cade4e832627b4f6"...) = 51
puts("Access Denied"Access Denied
) = 14
+++ exited (status 1) +++
PC: Here
- Sappiamo già che la prima riga mostra che la
__libc_start_mainfunzione è stata chiamata con quattro argomenti: l'indirizzo della funzione principale, il numero di argomenti del programma, un puntatore a un array degli argomenti del programma e un puntatore a una funzione da chiamare quando la funzione principale ritorna. - Le righe seguenti mostrano una serie di chiamate alla
strncmpfunzione, che confronta due stringhe e restituisce un numero intero che ne indica l'ordinamento lessicografico. Sembra che il programma stia cercando di confrontare ciascuna delle variabili di ambiente nel sistema con la stringa"Passw0rd=". - Successivamente, ci sono chiamate alle funzioni
MD5_Init,MD5_UpdateeMD5_Final, che fanno parte della funzione hash crittografica MD5 . Sembra che il programma stia calcolando l'hash MD5 del valore della variabile d'ambiente Passw0rd. - Successivamente, ci sono chiamate alla
sprintffunzione, che formatta una stringa e la memorizza in un buffer. Sembra che il programma stia formattando i byte dell'hash MD5 come valori esadecimali e memorizzandoli in stringhe. - L'output include una chiamata alla
strcmpfunzione con due stringhe come argomenti: "c4032d9e95a93d91b9b595dcfcca640b" e "098f6bcd4621d373cade4e832627b4f6". Ciò indica che il programma sta confrontando l'hash MD5 della password con l'hash della variabile di ambiente Passw0rd che è stata esportata. - La
putsfunzione viene chiamata alla fine con la stringa "Accesso negato", che indica che la Passw0rd non è corretta. Tuttavia, questo sarà probabilmente risolto presto.
Possiamo utilizzare questo sito Web per invertire le stringhe con hash ai loro valori.
Ora che abbiamo determinato che la password con hash è LionelMessi , possiamo impostare la Passw0rdvariabile di ambiente su questo valore ed eseguire nuovamente il ltracecomando per vedere se produce un risultato diverso. Proviamolo!
$ export Passw0rd=LionelMessi
$ ./crackme
Access Granted
È sempre importante ricordare di utilizzare password complesse e univoche e di non riutilizzare mai le password su account diversi.
Tieni d'occhio la nostra prossima versione su GitHub di un programma C che confronta gli hash MD5 con un dizionario e li inverte nella loro forma di stringa originale. Rimani sintonizzato!
Ci auguriamo che questo tutorial su come decifrare un semplice file ti sia piaciuto. Se hai commenti o domande, non esitare a lasciarli nella sezione commenti qui sotto. Buon hackeraggio!

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































