RISOLTO Impossibile fare il debug di un programma con gdb

Stato
Discussione chiusa ad ulteriori risposte.

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
Ispirato dalle guide di @DispatchCode ho deciso di buttarmi anch'io nel reversing, rispolverando e ampliando quelle poche conoscenze di assembly x86 che ho.
Ho quindi scaricato il migliore (nonché l'unico e il più facile) CrackMe per Linux su crackmes.one, con difficoltà/qualità relativamente di 1.0/4.0, e ho iniziato l'ispezione (altro modo per dire che l'ho avviato). Dopo aver constatato come funzionava, ho deciso di caricare il programma su gdb, ma mi da un errore: (No debugging symbols found in ./findthepassword1). Infatti mi è impossibile disassemblare qualsiasi parte del programma (o meglio posso, ma devo usare objdump), posso solo eseguirlo. Siccome vorrei continuare, c'è una soluzione a questo problema?
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Ispirato dalle guide di @DispatchCode ho deciso di buttarmi anch'io nel reversing, rispolverando e ampliando quelle poche conoscenze di assembly x86 che ho.
Ho quindi scaricato il migliore (nonché l'unico e il più facile) CrackMe per Linux su crackmes.one, con difficoltà/qualità relativamente di 1.0/4.0, e ho iniziato l'ispezione (altro modo per dire che l'ho avviato). Dopo aver constatato come funzionava, ho deciso di caricare il programma su gdb, ma mi da un errore: (No debugging symbols found in ./findthepassword1). Infatti mi è impossibile disassemblare qualsiasi parte del programma (o meglio posso, ma devo usare objdump), posso solo eseguirlo. Siccome vorrei continuare, c'è una soluzione a questo problema?

Bene, bene! Mi fa piacere averti ispirato.

Solo una cosa: dai uno sguardo al reversing sotto Win anche, ti è sufficiente una VM con Windows se non ne hai si una macchina fisica. 😉
Ci sono per altro un sacco di strumenti, anche comodi (di debuggers ce ne sono almeno 3-4).

Uno che puoi usare anche su Linux è Ghidra.
 
  • Mi piace
Reazioni: Hero467

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
La macchina con Windows ce l’ho, solo è in dual boot con Ubuntu, e mi scoccia spegnere e riaccendere ogni volta per cambiare OS. Poi sono abituato alla velocità e al risparmio di risorse di Ubuntu, quindi usare windows non mi va tanto.

Ho provato la VM, ho montato una iso di Windows 11 su VMWare, e ne sono rimasti delusissimo. Ho impiegato un’ora solo per installarlo, perché il mouse aveva una latenza altissima (1 minuto per la risposta). Dopo essere riuscito a installarlo le cose sono migliorate, ma non molto: si blocca comunque in alcuni punti, le animazioni sono tutte scattose è pessime da vedere, e le shortcut da tastiera non esistono, neanche solo premere il tasto Windows. E non sono stato avarissimo di risorse (32g di disco e 4g di memoria).

A Ghidra adesso do un’occhiata, grazie mille.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
La macchina con Windows ce l’ho, solo è in dual boot con Ubuntu, e mi scoccia spegnere e riaccendere ogni volta per cambiare OS. Poi sono abituato alla velocità e al risparmio di risorse di Ubuntu, quindi usare windows non mi va tanto.

Ho provato la VM, ho montato una iso di Windows 11 su VMWare, e ne sono rimasti delusissimo. Ho impiegato un’ora solo per installarlo, perché il mouse aveva una latenza altissima (1 minuto per la risposta). Dopo essere riuscito a installarlo le cose sono migliorate, ma non molto: si blocca comunque in alcuni punti, le animazioni sono tutte scattose è pessime da vedere, e le shortcut da tastiera non esistono, neanche solo premere il tasto Windows. E non sono stato avarissimo di risorse (32g di disco e 4g di memoria).

A Ghidra adesso do un’occhiata, grazie mille.

Per virtualizzare Win di solito uso VMware Player (disponibile sia per Win che per Linux), che preferisco a VirtualBox. Dagli 2-4 core, a seconda di quanti ne hai a disposizione.

Se ce l'hai disponibile su disco però ti direi di usare quello. Io reverso comunque sotto VM in buona parte dei casi in realtà (ho Win 10 e virtualizzo un altro Win 10, sto su Linux solo per lavoro): è bene non fidarsi troppo anche dei vari crackmes.

Mi fermo qui perchè andrei ulteriormente OT. In caso apri un topic in merito.
 

bigendian

Utente Attivo
749
432
OS
Linux
No debugging symbols found in ./findthepassword1

non e' un errore, ma semplicemente ti spiega che che il binario non ha i simboli
di debug, ma il disassemblato deve mostrarlo lo stesso, anche se in alcuni
binari "stripped" potrebbe mancare il main. Esiste un tool "unstrip" che recupera
alcuni simboli.

Inizierei da capire cosa vuoi debuggare

file ./findthepassword1

Posta l'output di quanto sopra per favore.

Che verisone hai di gdb ? Io qui 12.1
Ti chiede "Enabling debug symbols for this session ? " rispondi n
 
  • Mi piace
Reazioni: BrutPitt

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
No debugging symbols found in ./findthepassword1

non e' un errore, ma semplicemente ti spiega che che il binario non ha i simboli
di debug, ma il disassemblato deve mostrarlo lo stesso, anche se in alcuni
binari "stripped" potrebbe mancare il main. Esiste un tool "unstrip" che recupera
alcuni simboli.
Non disassembla. Se seleziono il main mi dice che non ci sono simboli di debug (a sto punto non credo neanche ci sia il main). Ho dato un'occhiata a quel tool di unstrip, ma ti sarei grato se riuscissi a essere un po' più specifico.

Inizierei da capire cosa vuoi debuggare

file ./findthepassword1
È un eseguibile linux, ma comunque l'output è questo
Codice:
./findthepassword1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped

Che verisone hai di gdb ? Io qui 12.1
Ti chiede "Enabling debug symbols for this session ? " rispondi n
12.1 anche io. Non mi chiede quanto sopra


Se può far comodo ho il source del CrackMe. È stato scritto in asm, ma comunque ce l'ho. Ho solo evitato di guardarlo per evitare di anticiparmi le cose
 

BrutPitt

Utente Attivo
1,166
1,262
È un eseguibile linux, ma comunque l'output è questo
Codice:
./findthepassword1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped
Immagino tu abbia installato Ubuntu 64bit... se cosi' fosse, immagino che tu sia cosciente di cercare di debuggare un programma 32bit in un ambiente 64bit.

Quindi ti chiedo:
Il programma "da solo" viene eseguito correttamente?
Ci sono tutte le librerie (32bit necessarie) installate?

Se cosi' non fosse... devi farlo.

ERRATA:
Nel caso affermativo (ambiente i386 installato) potrebbe essere causato dalla mancanza dell'"interprete":
Esegui:
Bash:
readelf -l ./findthepassword1 | grep interpreter
E controlla se il relativo file ".so" e' installato.


CORRIGE:
Errore mio: e' staticamente linkato, non serve
 
Ultima modifica:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Non disassembla. Se seleziono il main mi dice che non ci sono simboli di debug (a sto punto non credo neanche ci sia il main). Ho dato un'occhiata a quel tool di unstrip, ma ti sarei grato se riuscissi a essere un po' più specifico.


È un eseguibile linux, ma comunque l'output è questo
Codice:
./findthepassword1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped


12.1 anche io. Non mi chiede quanto sopra


Se può far comodo ho il source del CrackMe. È stato scritto in asm, ma comunque ce l'ho. Ho solo evitato di guardarlo per evitare di anticiparmi le cose

Secondo me continuerà comunque a non andarti, poichè tutte le info sono strippate. Non ho particolare dimestichezza con Linux, ma provo a guidarti.
Lancia gdb ./findthepassword1.

A questo punto digita info file, serve ad avere appunto le info, e ti darà l'entry point del programma (Nota: le info sono nell'header del file; Linux usa ELF, Windows usa PE).

Avrai qualcosa tipo:
Codice:
    Entry point: 0x8049000

a questo punto dovrai settare un breakpoint a questo indirizzo, e quindi farai:
Codice:
break *0x8049000

Ora lo lanci, digitando run. Non dovresti vedere nulla stampato a schermo, se non il fatto che è il breakpoint è "hit". Ora il programma è fermo e in teoria ti trovi all'entry point.

Prova a guardare il disassemblato controllando l'indirizzo puntato da EIP, quindi stampa alcune istruzioni, tipo:
Codice:
x/50i $eip

quello che vedi - o che dovresti vedere - è il codice assembly dell'eseguibile (e visto che è scritto in ASM e disponi del sorgente, se controlli, vedrai che saranno identici).

Cerca la parte di codice che ti interessa raggiungere, e setta un breakpoint come fatto qui sopra a quell'indirizzo; poi dovrai digitare continue, e il codice verrà eseguito sino al tuo BP.

Per vedere il contenuto dei registri devi digitare info registers (e mi sembra che facendo tipo info register $eax vedi il singolo registro).

E' MOLTO più scomodo di un tool grafico. Sotto Linux c'è anche Radare2 ora che mi ricordo, che dispone di una GUI (ma non è come sotto Windows, che hai l'imbarazzo della scelta 🙃).


PS: vista la semplicità di questo crackme (difficoltà = 1, come dicevi sopra), dubito si sia preso la briga di proteggerlo e di strippare "cose" per far del male a chi si avvicina... un consiglio che posso darti, e che è comunque meglio applicarlo sempre, è controllare le stringhe usate nel programma.
Lancia da shell strings <noome_file>, e vedrai tutte le stringhe... è probabile (molto) che la password sia in chiaro e visibile qui.

EDIT:
PPS: ricordati che Linux fa uso di AT&T come sintassi; io trovo più leggibile quella Intel. Puoi dire a GDB di usare Intel, cerca in rete (c'è un flag da passare o una qualche 'direttiva' che va data una volta in gdb).
 

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
Immagino tu abbia installato Ubuntu 64bit... se cosi' fosse, immagino che tu sia cosciente di cercare di debuggare un programma 32bit in un ambiente 64bit.
Si, mentre smanettavo con Ghidra per capire un po' come funziona ho notato che era a 32 bit

Quindi ti chiedo:
Il programma "da solo" viene eseguito correttamente?
Ci sono tutte le librerie (32bit necessarie) installate?

Se cosi' non fosse... devi farlo.
Si, il programma in se funziona alla perfezione

PS: vista la semplicità di questo crackme (difficoltà = 1, come dicevi sopra), dubito si sia preso la briga di proteggerlo e di strippare "cose" per far del male a chi si avvicina... un consiglio che posso darti, e che è comunque meglio applicarlo sempre, è controllare le stringhe usate nel programma.
Lancia da shell strings <noome_file>, e vedrai tutte le stringhe... è probabile (molto) che la password sia in chiaro e visibile qui.
Infatti ho trovato subito la password (8675309) così. Va be, allora ne proverò uno più difficile. Provo direttamente un difficoltà 2 o mi conviene un 1.5?

E' MOLTO più scomodo di un tool grafico. Sotto Linux c'è anche Radare2 ora che mi ricordo, che dispone di una GUI (ma non è come sotto Windows, che hai l'imbarazzo della scelta 🙃).
Do un'occhiata anche a quello, perché Ghidra è abbastanza macchinoso. Grazie

EDIT:
PPS: ricordati che Linux fa uso di AT&T come sintassi; io trovo più leggibile quella Intel. Puoi dire a GDB di usare Intel, cerca in rete (c'è un flag da passare o una qualche 'direttiva' che va data una volta in gdb).
Sisi, quello l'avevo già fatto la prima volta che ho messo mano a gdb. Anche se la sintassi AT&T non è così scomoda a parte $ e % in giro
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Infatti ho trovato subito la password (8675309) così. Va be, allora ne proverò uno più difficile. Provo direttamente un difficoltà 2 o mi conviene un 1.5?

Va bene anche a difficoltà 1, era per dire che nel reversing ci sono svariate strade, non sempre devi per forza leggere l'assembly e cercare li quello che ti serve.

Un consiglio che posso darti è cercare di crackare proprio questo CrackMe: cerca dove avviene il controllo e bypassalo modificando l'eseguibile. E' inutile che ti avventuri su cose più complesse, è bene che prendi dimestichezza con l'assembly almeno.

Per non andare OT non aggiungo altro sul reversing in sè; in caso apri pure un topic.

Do un'occhiata anche a quello, perché Ghidra è abbastanza macchinoso. Grazie
Si, non è semplicissimo Ghidra.
Radare2 l'ho usato anni fa, penso e spero sia migliorato da allora (prima Ghidra non esisteva). Sotto Linux non so come sia, ma se vuoi provare anche un disassembler, c'è il famoso IDA in versione Free. E' probabilmente il disassembler migliore o uno dei migliori (è meglio anche dei vari debuggers, in generale).

Sisi, quello l'avevo già fatto la prima volta che ho messo mano a gdb. Anche se la sintassi AT&T non è così scomoda a parte $ e % in giro

L'ho sempre trovata sporca oltre che "invertita": sono invertiti gli operandi, per spiegarmi:

AT&T:
Codice:
mov   0x12345, %eax

Intel
Codice:
mov  eax, 0x12345
 

bigendian

Utente Attivo
749
432
OS
Linux
AT&T cmq varia a seconda dell'architettura, se non ricordo male per arm e' ancora mov r0, 2, anche se AT & T

Amo l'assembly in linux e gas, e amo l'inline assembly comodissimo anche su microcontrollori 8bit come atmel avr,
dove l'assembly e' piu utile che su pc, banalmente nel codice C apri

asm volatile {
e vai di asm inline
}

Poi gas offre due formati per i sorgenti assembly, .S e .s ben diversi tra loro. il .S offre vari vantaggi e semplifica il lavoro.
All' asm volatile puoi ovviamente passare delle variabili, e prendere fuori i valori alal fine. Comodissimo .
 
Ultima modifica:

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
Allora, ho trovato dove fa il controllo
Codice:
0x804909a:    repz cmps BYTE PTR ds:[esi],BYTE PTR es:[edi]
0x804909c:    jecxz  0x80490b7
0x804909e:    nop
0x804909f:    mov    eax,0x4
0x80490a4:    mov    ebx,0x1
0x80490a9:    mov    ecx,0x804a0b3
e ho provato a modificare l'istruzione jecxz (che dovrebbe saltare se esi ed edi sono uguali) in jmp allo stesso indirizzo, ma continua a darmi un segmentation fault a 0x804909e, nonostante debba saltare.

Per il jump ho usato
Codice:
set *0x804909c = 0xeb19
che spulciando su internet dovrebbe essere un jmp rel8 con un salto di 27 byte.
Non so cosa sbaglio
 
Ultima modifica:
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!