2013-05-01 6 views
6

Ich möchte irgendwie die "Anzahl der ausgeführten Assembler-Anweisungen" aus einer Binärdatei bekommen. Betrachten Sie das folgende Stück Code:Wie wird die Anzahl der ausgeführten Assembler-Anweisungen gemessen?

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

Dann, wenn ich das Programm mit z beginnen würde "abc" würde den ersten Zweig nicht benötigen, daher würde es weniger Befehle ausführen. Wenn ich "pbc" einfüge, würde es den ersten Zweig nehmen, daher würde es etwas mehr (ungefähr 4-5) Anweisungen ausführen. (Dies ist etwas Forschung für CTF (Capture The Flag) -Dateien). Also meine Idee ist, anstatt eine binäre umzukehren und zu versuchen, den Algorithmus zu verstehen, verwende ich den schnelleren Ansatz beim Zählen der Anzahl der ausgeführten Assembler-Anweisungen für verschiedene Setups (wie verschiedene Zeichen oder Passwortlängen und so weiter, um zu sehen, ob ich einen anderen Zweig nehmen kann) Verwenden einer anderen Eingabe, wodurch mehr Assembleranweisungen erstellt werden).

Meine Grundidee wäre, einen einfachen Debugger zu schreiben, nur ein int3 nach dem aktuellen Befehl platzieren, dort einen Zähler inkrementieren, den nächsten Befehl disassemblieren und direkt nach diesem Befehl ein int3 platzieren (stark vereinfachte Version meiner Idee).

Gibt es ein Programm/eine Bibliothek/... welches schon das Zeug gemacht hat? (Weil ich einige Probleme sehe, wenn das Programm mit Signalen beschäftigt, ...)

(Ich habe bereits versucht, mit hoher Präzision Timer, um die Zeit zu messen, aber das war ein komplettes Scheitern wegen des Unterschieds sind nur 4-5 Anweisungen)

+1

Offenbar ist diese Art von Riss hat einen Namen, Angriff Timing-http://en.wikipedia.org/wiki/Timing_attack jedoch Es funktioniert nur, wenn der betreffende Algorithmus schnell ausfällt oder aufgrund seiner Eingabe andere Ausführungszeiten benötigt, was nicht garantiert ist. – Patashu

+0

Im Grunde sprichst du über eine Anweisungsablaufverfolgung. –

+0

Nein, ich möchte keinen "Timing-Angriff" machen Ich möchte nicht die "Zeit" zum Vergleich verwenden, ich möchte die "Anzahl der ausgeführten Anweisungen" verwenden. Nutzungszeit ist wegen der Verzerrung nicht möglich. Und ich suche nach Programmen, die ich dazu verwenden kann, –

Antwort

5

Das Linux "perf" -Tool kann Hardware-Leistungsindikatoren verwenden, um Ihnen genaue Zahlen für viele Dinge einschließlich der ausgeführten Anweisungen zu geben.

$ 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 

Um nur User-Mode-Anweisungen zu erhalten: obwohl, wie 5-6 Anweisungen

$ 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 

ich ein wenig Varianz in dieser zu sehen. Nicht sicher, ob das real ist oder nur ein Messartefakt. Um zuverlässigere Ergebnisse zu erhalten, denke ich an einen Simulator wie Valgrind. Ich hatte etwas Glück stabil Anweisung bekommen zählt, dass nur durch 1 Anweisung von diesen beiden Befehle variieren:

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

Hm, ja, das ist genau die Ausgabe, nach der ich suche, aber mit 1 Problem: Dieses Tool gibt mir ALLE Anweisungen (auch Kernel-Anweisungen). Wenn ich es also 100 Mal mit der gleichen Eingabe starte, ändert sich die Anzahl der Anweisungen jedes Mal (in etwa 1000 - 10000 Anweisungen). Und ich möchte einen Unterschied von 5 Anweisungen sehen, daher ist es nicht möglich, wenn ich ein CPU-Logging-Register verwende. Jeder andere kennt ein Programm, das nur Usermode-Anweisungen überwacht? –

+1

Versuchen Sie: 'Perf stat -e Anweisungen: Befehl '. Dies zählt nur Benutzermodus-Anweisungen. Mehr Infos unter https://perf.wiki.kernel.org/index.php/Tutorial#Counting_with_perf_stat –

+0

Vielen Dank! Das funktioniert! Vielen Dank! –

Verwandte Themen