2013-05-01 10 views
6

Voglio in qualche modo ottenere il "numero di istruzioni assembler eseguite" da un binario. Si consideri il seguente pezzo di codice:Come misurare il numero di istruzioni assembler eseguite?

if(password[0] == 'p') { 
if(password[1] == 'a') { 
    ...... 
    printf("Correct Password\n"); 
} 
} 

Poi se vorrei iniziare il programma con esempio "abc" non avrebbe preso il primo ramo, quindi avrebbe eseguito meno istruzioni. Se inserissi "pbc" ci vorrebbe il primo ramo, quindi eseguirò un po 'di più (circa 4-5) istruzioni. (Si tratta di alcuni file di ricerca per CTF (Capture The Flag)). Quindi la mia idea è invece di invertire un binario e provare a capire l'algoritmo, io uso l'approccio più veloce nel conteggio del numero di istruzioni assembler eseguite per diverse configurazioni (come caratteri diversi o lunghezze di password e così via per vedere se posso prendere un'altra filiale usando un altro input creando così più istruzioni assembler).

La mia idea di base sarebbe scrivere un semplice debugger inserendo un int3 dopo l'istruzione corrente, incrementare un contatore, disassemblare l'istruzione successiva e inserire un int3 subito dopo questa istruzione (versione fortemente semplificata della mia idea).

C'è qualche programma/libreria/... che ha già fatto quella roba? (Perché vedo alcuni problemi quando il programma si occupa di segnali, ...)

(Ho già provato a utilizzare i timer ad alta precisione per misurare il tempo, ma quello era un completo fallimento a causa della differenza sono solo 4-5 istruzioni

+1

A quanto pare questo tipo di crepa ha un nome, Timing attacco http://en.wikipedia.org/wiki/Timing_attack Tuttavia , funziona solo se l'algoritmo in questione fallisce velocemente, o altrimenti richiede tempi di esecuzione diversi in base al suo input, il che non è garantito. – Patashu

+0

Fondamentalmente stai parlando di una traccia di istruzioni. –

+0

No, non voglio fare un "attacco di temporizzazione" Non voglio usare il "tempo" per il confronto, voglio usare il "numero di istruzioni eseguite". Il tempo di utilizzo non è possibile a causa del bias. E cerco programmi che posso usare per fare questo –

risposta

5

Lo strumento "perf" di Linux può utilizzare contatori delle prestazioni hardware per fornire numeri precisi per molte cose, incluse le istruzioni eseguite.

$ perf stat true 

Performance counter stats for 'true': 

      0.183734 task-clock    # 0.314 CPUs utilized   
       0 context-switches   # 0.000 M/sec     
       0 CPU-migrations   # 0.000 M/sec     
       118 page-faults    # 0.642 M/sec     
      627,313 cycles     # 3.414 GHz      
      396,604 stalled-cycles-frontend # 63.22% frontend cycles idle 
      268,222 stalled-cycles-backend # 42.76% backend cycles idle 
      404,935 instructions    # 0.65 insns per cycle   
              # 0.98 stalled cycles per insn 
      75,949 branches     # 413.364 M/sec     
      3,602 branch-misses    # 4.74% of all branches   

     0.000584503 seconds time elapsed 

di ottenere solo le istruzioni in modalità utente:

$ perf stat -e instructions:u true 

Performance counter stats for 'true': 

      92,687 instructions:u   # 0.00 insns per cycle   

     0.000520925 seconds time elapsed 

vedo un po 'di variabilità in questo, però, come il 5-6 istruzioni. Non sono sicuro che sia reale o solo un artefatto di misurazione. Per ottenere risultati più affidabili, penso di passare a un simulatore come Valgrind. Ho avuto qualche fortuna ottenere istruzioni stabile conta che variano solo da 1 istruzioni da questi due comandi:

$ valgrind --tool=callgrind true 
$ valgrind --tool=exp-bbv true 
+1

Hm, sì, è esattamente l'output che sto cercando ma con 1 problema: questo strumento mi dà TUTTE le istruzioni (anche le istruzioni del kernel). Quindi se lo avvio 100 volte con lo stesso input, il conteggio delle istruzioni cambierà ogni volta (in circa 1000 - 10000 istruzioni). E voglio vedere una differenza di 5 istruzioni, quindi non è possibile se utilizzo un registro di registrazione della CPU. Qualcun altro conosce un programma che controlla solo le istruzioni Usermode? –

+1

Provare: 'perf stat -e istruzioni: u comando'. Ciò conterrà solo le istruzioni in modalità utente. Maggiori informazioni su https://perf.wiki.kernel.org/index.php/Tutorial#Counting_with_perf_stat –

+0

Grazie mille! Questo funziona! Grazie! –

Problemi correlati