Domanda

Così sto cercando di utilizzare l'utilità objdump di costruire un flusso di controllo grafico dal gruppo, e sto correndo in un problema. In pratica, ogni volta che si verifica un ramo e l'indirizzo di destinazione è relativo io non sono sicuro di come sapere dove inizi il prossimo blocco di base. Non sono sicuro se devo essere chiaro, quindi aggiungerò un esempio. Dire il mio programma sta attraversando l'uscita objdump, e ha registrato l'indirizzo di partenza per il primo blocco di base. E poi colpisce un comando di salto che utilizza l'indirizzamento relativo al punto all'indirizzo corretto per saltare. So che la fine del mio primo blocco di base avviene proprio lì, ma come posso fare per ottenere l'indirizzo giusto per l'inizio del successivo blocco di base? Qualsiasi orientamento chiunque può fornire sarebbe molto apprezzato, io sono un novizio x86 al meglio e mi è stato sbattere la testa contro questo per la settimana passata.

È stato utile?

Soluzione

Supponendo che ho capito la domanda, forse questo ti permetterà di cominciare. salti relativi vengono basato su PC.

d: eb 04 jmp 13 

0xEB è il codice operativo per un salto relativa sulla base di un 8 bit immediato. L'indirizzo dell'istruzione è nell'output objdump, in questo caso d o 0xD. è un'istruzione di due byte (x86 lunghezza variabile). ti dice nell'output ciò che l'indirizzo di destinazione è, in questo caso JMP 13. Così, cercando la riga nell'output objdump che inizia con 13 e due punti è l'inizio di quella successiva pezzo di codice.

Per capire come viene calcolato questo indirizzo. Il pc è 0xD quando inizia a prendere l'istruzione, richiede due byte, in modo che il pc è in 0xD + 2 = 0xF quando è pronto per eseguire questa istruzione. Il 0x4 offset è così 0xF + ??0x4 = 0x13 l'indirizzo di destinazione.

20: 75 ed jne f

Lo stesso vale per all'indietro. pc più numero di byte = 0x20 + 2 = 0x22. 0xED è un numero con segno ed è negativo in modo da firmare estendersi 0xED a 0xFFFFFFF ... FFFFED, per quanto grande il vostro registro di indirizzo è. Aggiungere 0x22 + 0xFFFFFF ... FFFED e si ottiene 0x0F l'indirizzo di destinazione. Si può anche prendere 0xED, capovolgere e aggiungere 1 a negarlo. ~ 0xED = 0x12, 0x12 + 1 = 0x13. Così 0xED mezzi sottrarre 0x13. 0x22-0x13 = 0x0F.

Qui ci sono alcuni più, in ogni caso ti dà l'indirizzo di destinazione, che si può solo cercare nel uscita objdump.

Per capire come si calcola questo valore. Stessa storia, inizia con codice operativo a 0x400A81, richiede 6 byte in questo caso per l'istruzione di lunghezza variabile. Quindi per il momento si è pronti per eseguire il pc è in 0x400A81 + 6 = 0x400A87. L'offset è 0x107 quindi se la condizione è soddisfatta l'indirizzo di destinazione è 0x400A87 + 0x107 = 0x400B8E.

Si noti questi sono grepped da un programma più ampio, non il codice sequenziale, solo un insieme di esempi isolati.

  400a81:   0f 8f 07 01 00 00       jg     400b8e 
  400a8f:   0f 8f e6 00 00 00       jg     400b7b 
  400a9d:   0f 8f c5 00 00 00       jg     400b68 
  400aab:   0f 8f a4 00 00 00       jg     400b55 
  400ab9:   0f 8f 83 00 00 00       jg     400b42 
  401d76:   0f 8f 31 01 00 00       jg     401ead 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top