首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何测量执行的汇编指令的数量?

如何测量执行的汇编指令的数量?
EN

Stack Overflow用户
提问于 2013-05-01 11:20:39
回答 1查看 2.5K关注 0票数 6

我想以某种方式从一个二进制文件中获得“已执行的汇编指令数”。考虑下面这段代码:

代码语言:javascript
运行
复制
if(password[0] == 'p') {
 if(password[1] == 'a') {
   ......
     printf("Correct Password\n");
 }
}

然后,如果我以"abc“开始程序,它就不会执行第一个分支,因此它将执行较少的指令。如果我输入"pbc“,它将执行第一个分支,因此它将执行更多(大约4-5)条指令。(这是对CTF (捕获标志)文件的一些研究)。因此,我的想法不是反转二进制并试图理解算法,而是使用更快的方法来计算不同设置(如不同的字符或密码长度等)执行的汇编指令的数量,看看是否可以使用另一个输入进行另一个分支,从而创建更多的汇编指令。

我的基本想法是编写一个简单的调试器,只需在当前指令后面放置一个int3,在那里增加一个计数器,反汇编下一条指令,并在这条指令后面放置一个int3 (我的想法的强大简化版本)。

有没有什么程序/库/...它已经做过这些事情了?(因为我在程序处理信号时看到了一些问题,...)

(我已经尝试使用高精度计时器来测量时间,但这完全失败了,因为差异只有4-5条指令)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-01 15:40:54

Linux "perf“工具可以使用硬件性能计数器为您提供许多事情的精确数字,包括执行的指令。

代码语言:javascript
运行
复制
$ 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

要仅获取用户模式指令,请执行以下操作:

代码语言:javascript
运行
复制
$ 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这样的模拟器。我幸运地得到了稳定的指令计数,这两个命令只有一条指令不同:

代码语言:javascript
运行
复制
$ valgrind --tool=callgrind true
$ valgrind --tool=exp-bbv true
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16312270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档