我想以某种方式从一个二进制文件中获得“已执行的汇编指令数”。考虑下面这段代码:
if(password[0] == 'p') {
if(password[1] == 'a') {
......
printf("Correct Password\n");
}
}
然后,如果我以"abc“开始程序,它就不会执行第一个分支,因此它将执行较少的指令。如果我输入"pbc“,它将执行第一个分支,因此它将执行更多(大约4-5)条指令。(这是对CTF (捕获标志)文件的一些研究)。因此,我的想法不是反转二进制并试图理解算法,而是使用更快的方法来计算不同设置(如不同的字符或密码长度等)执行的汇编指令的数量,看看是否可以使用另一个输入进行另一个分支,从而创建更多的汇编指令。
我的基本想法是编写一个简单的调试器,只需在当前指令后面放置一个int3,在那里增加一个计数器,反汇编下一条指令,并在这条指令后面放置一个int3 (我的想法的强大简化版本)。
有没有什么程序/库/...它已经做过这些事情了?(因为我在程序处理信号时看到了一些问题,...)
(我已经尝试使用高精度计时器来测量时间,但这完全失败了,因为差异只有4-5条指令)
发布于 2013-05-01 15:40:54
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这样的模拟器。我幸运地得到了稳定的指令计数,这两个命令只有一条指令不同:
$ valgrind --tool=callgrind true
$ valgrind --tool=exp-bbv true
https://stackoverflow.com/questions/16312270
复制相似问题