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
risposta
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
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.
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
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). –
Perché lo indovideresti? c'è un modo per testarlo? è in esecuzione come interfaccia grafica con GDB di seguito. –
Oppure potrebbe non esserci delocalizzazione. Tuttavia, se si esegue il dump degli opcode con l'assembly, sarà possibile visualizzare l'offset. – Mark
È 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
Ti consiglio di utilizzare un editor esadecimale e semplicemente cambiando il valore se è solo una cosa di una volta.
Perché diamine hai bisogno di passare a un indirizzo raw? Ho difficoltà a capire qualsiasi possibile (non nefasto) uso per quello. – kquinn
Che sistema usi? –
@kquinn a prescindere, la sua domanda è stata posta, proviamo a rispondere. – samoz