2012-04-27 2 views
10

gdb fornisce funzionalità per leggere o scrivere a uno specifico indirizzo lineare , ad esempio:Come utilizzare un indirizzo logico in gdb?

(gdb) x/1wx 0x080483e4 
0x80483e4 <main>:  0x83e58955 
(gdb) 

ma come si fa a specificare un indirizzo logico? Mi sono imbattuto la seguente istruzione:

0x0804841a <+6>:  mov %gs:0x14,%eax 

Come posso leggere la memoria a "% gs: 0x14" in gdb, o tradurre questo indirizzo logico ad un indirizzo lineare che potrei usare in x di comando?

nota: so che potrei semplicemente leggere% eax dopo questa istruzione, ma non è la mia preoccupazione

+0

possibile duplicato di [come risolvere segmento: offset adres in GDB] (http://stackoverflow.com/questions/4006686/how-to-resolve-segmentoffset-adres-in-gdb). Però non ha una buona risposta. – Job

risposta

4

come posso leggere la memoria a "% gs: 0x14" in gdb

Non è possibile: GDB non ha modo di sapere in che modo il segmento a cui si riferisce %gs è stato impostato.

o tradurre questo indirizzo logico ad un indirizzo lineare che potrei usare al comando x

Anche in questo caso, non si può fare questo in generale. Tuttavia, sembra che tu sia su Linux x86 a 32 bit, e lì puoi fare - lo %gs è impostato per puntare al descrittore di thread tramite la chiamata di sistema set_thread_area.

È possibile eseguire catch syscall set_thread_area in GDB ed esaminare i parametri (ogni thread avrà una chiamata di questo tipo). Il codice per farlo effettivamente è here. Una volta che sai come è stato impostato %gs, aggiungi 0x14 allo base_addr e il gioco è fatto.

+0

Bella risposta. Sfortunatamente, il mio programma sembra non chiamare set_thread_area (2). Puoi vedere il codice sorgente qui: http://pastebin.com/us5sbzVg (opzioni di compilazione fornite nel codice sorgente). – user368507

+1

@ user368507 Il tuo programma ha solo un thread. Il programma * fa * chiama 'set_thread_area' (dovresti essere in grado di vederlo sotto' strace'). Sono stato in grado di prendere quella chiamata con GDB; non sono sicuro del motivo per cui affermi che "set_thread_area" non viene chiamato. –

+0

il mio errore. Ho usato un altro computer dopo l'OP. Era un x86-64 ... Sei anwser funziona perfettamente su 32 bit x86. Suppongo che le cose siano diverse su x86-64. – user368507