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命令であるため、完全に失敗しました)

4

1 に答える 1

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 のようなシミュレーターを使用することを考えています。これらの 2 つのコマンドから 1 命令だけ異なる安定した命令数を得ることができました。

$ valgrind --tool=callgrind true
$ valgrind --tool=exp-bbv true
于 2013-05-01T07:40:53.957 に答える