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 这样的模拟器。我很幸运地获得了稳定的指令计数,这些指令计数仅因这两个命令的 1 条指令而异:

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