Sono fuori dall'eseguibile di destinazione di gdb e non ho nemmeno uno stack che corrisponda a tale destinazione. Voglio comunque eseguire un singolo passaggio, in modo da poter verificare cosa sta succedendo nel mio codice assembly, perché non sono un esperto di assembly x86. Sfortunatamente, gdb si rifiuta di eseguire questo semplice debug a livello di assembly. Mi consente di impostare e fermarmi su un punto di interruzione appropriato, ma non appena provo a eseguire un singolo passaggio in avanti, gdb segnala l'errore "Impossibile trovare i limiti della funzione corrente" e l'EIP non cambia.
Dettagli aggiuntivi:
Il codice macchina è stato generato dalle istruzioni gcc asm e l'ho copiato nella posizione di memoria del kernel dove è in esecuzione, dall'output di objdump -d. Non mi dispiacerebbe un modo semplice per utilizzare un caricatore per caricare il mio codice oggetto su un indirizzo riposizionato, ma tieni presente che il caricamento deve essere eseguito in un modulo del kernel.
Suppongo che un'altra alternativa sarebbe quella di produrre un falso modulo del kernel o un file di informazioni di debug da dare a gdb, per fargli credere che quest'area sia all'interno del codice del programma. gdb funziona bene sullo stesso eseguibile del kernel.
(Per coloro che lo vogliono davvero sapere, sto inserendo codice in fase di esecuzione nello spazio dati del kernel Linux all'interno di una VM VMware e lo sto eseguendo da gdb debug remoto del kernel tramite lo stub gdb integrato di VMware Workstation. Nota non sto scrivendo kernel exploit; Sono uno studente laureato in sicurezza che scrive un prototipo.)
(Posso impostare un punto di interruzione su ogni istruzione all'interno del mio assembly. Funziona ma diventerebbe piuttosto laborioso dopo un po ', poiché la dimensione delle istruzioni di assembly x86 varia e la posizione dell'assembly cambierà ogni volta che riavvio.)