2009-04-21 14 views
6

Come compito per una classe di sicurezza, sto cercando di utilizzare __asm__("jmp 0xbffff994"); nel mio codice, ma quando disassembro le cose in gdb, l'istruzione viene modificata in jmp 0xc8047e2a. Qualche idea sul perché e come posso passare a un particolare indirizzo?x86 passare a un indirizzo

+2

Perché diamine hai bisogno di passare a un indirizzo raw? Ho difficoltà a capire qualsiasi possibile (non nefasto) uso per quello. – kquinn

+0

Che sistema usi? –

+5

@kquinn a prescindere, la sua domanda è stata posta, proviamo a rispondere. – samoz

risposta

18

Probabilmente perché è un salto a un indirizzo relativo e il linker o il caricatore ha spostato il codice. Prova a mettere l'indirizzo in una variabile, e poi fare:

jmp dword [var] 

o in alternativa:

push 0xbffff994 
ret 
+5

* che * è la risposta corretta, nota anche che: "mov eax, 0x11223344; jmp eax"; funzionerà anche ed è probabilmente la più semplice. –

+1

molto vero, ma potrebbe usare fastcall (non sono sicuro del significato di 0xbffff994). – Mark

+0

La combinazione PUSH RET funziona! Grazie! – Martin

0

Daniel Spiega perché il tuo salto non è lo stesso che hai programmato. Ha a che fare con file di oggetti e collegamenti.

se si desidera passare a un indirizzo particolare, è meglio correggere il salto utilizzando un debugger o un disassemblatore.

0

Sul mio sistema (gcc version 4.2.4, Ubuntu) questo sembra a posto sul disassmbley (insight) :

 
int main() 
{ 
asm("jmp 0xbffff994"); 
return 0; 
};  

risultati del disassmbley (Insight):

 
     0x8048344  :     lea 0x4(%esp),%ecx 
-  0x8048348  :    and $0xfffffff0,%esp 
-  0x804834b  :    pushl -0x4(%ecx) 
-  0x804834e  :    push %ebp 
-  0x804834f  :    mov %esp,%ebp 
-  0x8048351  :    push %ecx 
-  0x8048352  :    jmp 0xbffff994 
-  0x8048357  :    mov $0x0,%eax 
-  0x804835c  :    pop %ecx 
-  0x804835d  :    pop %ebp 
-  0x804835e  :    lea -0x4(%ecx),%esp 
-  0x8048361  :    ret 
+0

Direi che quel disassemblatore sta mostrando l'offset della jmp e non il suo vero obiettivo. (l'istruzione jmp prende un offset relativo a eip quando gli si dà un operando immediato a 32 bit). –

+0

Perché lo indovideresti? c'è un modo per testarlo? è in esecuzione come interfaccia grafica con GDB di seguito. –

+0

Oppure potrebbe non esserci delocalizzazione. Tuttavia, se si esegue il dump degli opcode con l'assembly, sarà possibile visualizzare l'offset. – Mark

0

È difficile determinare l'indirizzo esatto al momento della compilazione, hai provato a utilizzare le etichette? È molto più comune usarli con jmp.

esempio:

start: 
jmp exit 

exit: 
ret 
0

Ti consiglio di utilizzare un editor esadecimale e semplicemente cambiando il valore se è solo una cosa di una volta.

Problemi correlati