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.
- 1. Assegnazione di un indirizzo a un puntatore
- 2. Perché associare un socket a un indirizzo?
- 3. Cosa significa un asterisco * prima di un indirizzo nell'assembly AT & T x86-64?
- 4. Conversione di un int a un indirizzo IP
- 5. Puntatore a un indirizzo fisso specifico
- 6. expressjs associare a un indirizzo IP specifico
- 7. indirizzo iniziale dell'array a e & un
- 8. Perché il codice deve essere allineato ai limiti di indirizzo pari su x86?
- 9. Che cosa contiene la variabile Powershell $ {env: ProgramFiles (x86)} su un sistema a 32 bit/x86?
- 10. assemblaggio x86: passare il parametro a una funzione tramite lo stack
- 11. Come ottenere un indirizzo IP da un indirizzo Mac a livello di programmazione su Android?
- 12. Passare un parametro a ICommand
- 13. passare parametri a un thread
- 14. Assegna indirizzo vettoriale a iteratore
- 15. GDB: Watchpoint a indirizzo fisso
- 16. È x86 CMPXCHG atomico?
- 17. Come determinare se un indirizzo IP appartiene a un paese
- 18. Intrecciato: come associare un server a un indirizzo IP specificato?
- 19. Dando a un contenitore docker un indirizzo IP instradabile
- 20. Qualcuno può spoofingare un indirizzo IP a un numero qualsiasi?
- 21. Come passare un evento a un metodo?
- 22. Come passare un URI a un intent?
- 23. Geocode un indirizzo IP?
- 24. indirizzo C di un indirizzo di una variabile
- 25. Indirizzo della variabile per-cpu
- 26. Puoi passare un vettore a un vararg ?: Vector a sprintf
- 27. Come ottenere il proprio indirizzo IP con un indirizzo socket?
- 28. Dereferenziare un'etichetta in assembly x86
- 29. Come determinare a quale azienda appartiene un indirizzo IP?
- 30. Come convertire un indirizzo da IPv4 a IPv6
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