2013-05-01 90 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