2013-05-01 87 views
6

我想以某種方式從二進制文件中獲取「執行的彙編指令的數量」。 考慮下面的代碼段:如何測量執行的彙編程序指令的數量?

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

然後,如果我將開始與例如該程序「ABC」它不會採取第一個分支,因此它會執行更少的指令。如果我放入「pbc」,它會佔用第一個分支,因此它會執行更多(大約4-5)的指令。 (這是CTF(Capture The Flag)文件的一些研究)。所以我的想法不是顛倒二進制,試圖理解算法,我使用更快的方法計算不同設置的執行彙編指令的數量(如不同的字符或密碼長度等),以查看是否可以採用另一個分支使用另一個輸入,從而創建更多彙編指令)。我的基本想法是編寫一個簡單的調試器,在當前指令之後放置一個int3,遞增一個計數器,反彙編下一條指令,並在該指令後面放置一個int3(我的想法的簡化版本)。

是否有任何程序/庫/ ...已經做了那些東西? (因爲當程序處理信號時我看到一些問題,...)

(我已經嘗試過使用高精度定時器來測量時間,但這是一個完全失敗,因爲它們之間的區別只是4-5條指令)

+1

顯然,這種裂縫都有一個名字,計時攻擊http://en.wikipedia.org/wiki/Timing_attack然而,它只有在問題算法快速失敗時纔有效,或者根據其輸入執行不同的時間量來執行,但這並不一定如此。 – Patashu 2013-05-01 03:31:00

+0

基本上你在談論做指令跟蹤。 – 2013-05-01 03:36:27

+0

不,我不想做「定時攻擊」我不想用「時間」進行比較,我想用「執行指令的數量」。由於偏見,使用時間是不可能的。我搜索我可以用來做的那些程序 – 2013-05-01 03:48:10

回答

5

Linux「perf」工具可以使用硬件性能計數器爲您提供許多事情的準確數字,包括執行的指令。

$ 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 

要獲得唯一的用戶模式指令:

$ 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 

我看到方差一點點這雖然,像5-6的說明。不知道這是真的還是隻是一個測量工件。爲了獲得更可靠的結果,我想轉向像Valgrind這樣的模擬器。我有一些運氣得到穩定的指令計數,只有這兩個命令1個指令不同而不同:

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

嗯,是的,這正是我正在尋找的輸出,但有1個問題:這個工具給我所有的指令(也是內核指令)。因此,如果我用相同的輸入啓動它100次,指令計數將每次都會改變(大約在1000 - 10000條指令中)。我想看到5個指令的差異,因此如果我使用CPU日誌記錄寄存器是不可能的。任何人都知道只監視用戶模式說明的程序? – 2013-05-01 21:55:51

+1

嘗試:'perf stat -e指令:u命令'。這將只計算用戶模式指令。更多信息,請訪問https://perf.wiki.kernel.org/index.php/Tutorial#Counting_with_perf_stat – 2013-05-02 07:38:59

+0

非常感謝!這工作!謝謝! – 2013-05-02 23:49:24