2013-04-15 7 views
5

Ho un programma che devo applicare con il GDB. Il problema è che esiste una riga di codice che effettua un" test minore o uguale "e non riesce a causare il programma per finire con un errore di segmentazione.Il programma è già compilato e non ho la sorgente quindi non posso cambiare il codice sorgente ovviamente.Tuttavia, usando GDB, sono stato in grado di individuare dove è stato eseguito il test < = e poi sono riuscito per individuare l'indirizzo di memoria che potete vedere qui sotto.Patching GDB restituisce "Impossibile accedere alla memoria all'indirizzo 0x

(gdb) x/100i $pc 
    ... removed extra lines ... 
    0x7ffff7acb377:  jle 0x7ffff7acb3b1 
    .... 

Tutto quello che devo fare è cambiare il test ad una 'maggiore o uguale a' test e quindi il programma dovrebbe funzionare bene. il codice operativo per JLE è 0x7e e ho bisogno di cambiarlo in 0x7d. Il mio assig nment fornisce le istruzioni su come fare questo nel modo seguente:

$ gdb -write -q programtomodify 
    (gdb) set {unsigned char} 0x8040856f = 0x7d 
    (gdb) quit 

Quindi cerco e ottenere ...

$ gdb -write -q player 
    (gdb) set {unsigned char} 0x7ffff7acb377 = 0x7d 
    Cannot access memory at address 0x7ffff7acb377 

Ho provato vari altri indirizzi di memoria e non importa quello che cerco io ottenere il stessa risposta. Questo è il mio unico problema, non mi interessa se è l'indirizzo sbagliato o l'istruzione di codice errato a questo punto, voglio solo essere in grado di modificare la memoria.

Sono in esecuzione di Linux Mint 14 tramite VMware Player

Grazie

+0

puoi farlo anche in qualsiasi altro editor esadecimale (ma gli indirizzi funzionano in modo un po 'diverso in gdb) – Blauhirn

risposta

2

Cannot access memory at address 0x7ffff7acb377

Si sta cercando di scrivere in un indirizzo dove alcuni condiviso risiede biblioteca. Puoi scoprire quale libreria è con info sym 0x7ffff7acb377.

Nel momento in cui si sta tentando di eseguire la patch, la suddetta libreria condivisa ha non è stata caricata ancora, il che spiega il messaggio ricevuto.

Eseguire il programma su main. Quindi dovresti riuscire a scrivere all'indirizzo. Tuttavia, devi avere il permesso di scrittura sulla libreria per rendere il tuo "bastone" di scrittura.

+0

Grazie, questo ha risolto il mio problema. Alla fine ho dovuto scrivere su un indirizzo diverso che non faceva parte di una libreria condivisa, ma questo mi ha portato a scoprire dove/come avevo bisogno di cambiare le cose. Grazie! –