Compago

...free knowledge

 
  • Increase font size
  • Default font size
  • Decrease font size
Home Manuali Programmazione Come trovare l'indirizzo attuale del codice in esecuzione

Come trovare l'indirizzo attuale del codice in esecuzione

E-mail Stampa PDF

In questo articolo vedremo come recuperare l'indirizzo attuale del codice in esecuzione.
Vorrei spendere due parole per quanto riguarda l'utilità di questo procedimento, infatti molti potrebbero chiedersi "ma a che mi serve?". Nella normale programmazione solitamente questo tipo di informazioni ci viene assolutamente nascosto, dato che è il compilatore a fare tutto il lavoro per noi, ma se qualcuno volesse "intervenire" direttamente sul processo in memoria o sul file potrebbe invece essere molto interessato a scoprire la posizione attuale del codice in memoria.

Do per scontato che chi sta leggendo questo articolo sappia come è organizzato un processore di tipo intel e conosca i suoi registri e le rispettive funzioni.
Ad ogni modo l'indirizzo della istruzione attuale in corso di esecuzione è conservata nel registro EIP, quindi il metodo più semplice di recuperare questa informazione sarebbe quella di utilizzare una istruzione del tipo "MOV EAX,EIP". Peccato che questa istruzione non esista tra quelle a disposizione, quindi dovremo ricorrere a qualche truccheto.
Le istruzioni con le quali interagiamo col registro EIP sono le call e i ret, infatti durante una call viene salvato nello stack l'indirizzo della istruzione successiva, mentre col ret esso viene ripristinato nell'EIP , quindi con una call posso leggere l'EIP mentre con un ret lo posso sovrascrivere.
Vediamo di mettere in pratica quanto esposto di sopra:

Indirizzo  Codice       Istruzione
------------------------------------- 
0040915F   E800000000   CALL 00000000
00409164   58          POP EAX

in questo modo con la prima istruzione (CALL 0) eseguiamo implicitamente un push dell'indirizzo della istruzione successiva e in cima allo stack avremo il valore 00409164.
La call fa proseguire il flusso del programma e la prossima istruzione dovrà essere quindi quella indicata dall'offset , che in questo caso è 0, e cioè l'istruzione successiva. Questa istruzione è il POP EAX , cioè estraggo il valore in cima allo stack e lo metto nel registro EAX. A questo punto posso farci quello che mi pare.

In questa doppio passaggio l'indirizzo recuperato è quello in corrispondenza della istruzione pop , quindi il resto del programma, volendo sfruttare questa informazione, dovrà tenere conto della posizione relativa delle varie istruzioni rispetto al pop.

Per chi avesse a che fare con uno shellcode invece tutto questo non basta, dato che gli zeri usati per la call creerebbero dei problemi, quindi bisognerà usare un altro metodo:

Indirizzo  Codice        Istruzione          Commento
--------------------------------------------------------
0040915F   EB 03         JMP SHORT 00409164 //salto +5
00409161   58            POP EAX //recupera il valore in cima allo stack
00409162   EB 05         JMP SHORT 00409169 //salto +7
00409164   E8 F8FFFFFF   CALL 00409161 //salta indietro -3
00409169   90            NOP //posizione finale
0040916A   90            NOP
0040916B   90            NOP

Spiegazione:

  1. Come prima operazione eseguo un salto in avanti proprio sulla CALL (JMP SHORT 00409164).
  2. La CALL questa volta ha un offset negativo quindi in questo modo eliminiamo gli zeri che non ci piacevano. La CALL memorizza nello stack l'indirizzo della istruzione successiva, che sarà 00409169. Salta indietro all'indirizzo 00409161.
  3. Con il pop carico nel registro EAX il valore che la CALL aveva  memorizzato nello stack.
  4. Salta in avanti di 7 byte e prosegue il programma.

tutto ciò è un po più complicato di prima ma svolge la stessa funzione senza usare byte uguali a zero.

In allegato troverete dei micro programmi di test, creati da uno stesso scheletro di applicazione in delphi e poi modificata.


Attachments:
Download this file (curent address.zip)curent address.zip[Test esemplificativi]76 Kb
Ultimo aggiornamento ( Venerdì 29 Aprile 2011 07:22 )  
Loading

Login




Chiudi