gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:12:48 24 4
gpt4 key购买 nike

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

if(password[0] == 'p') {
if(password[1] == 'a') {
......
printf("Correct Password\n");
}
}

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

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

是否有任何程序/库/...已经完成了这些工作? (因为我在程序处理信号时看到了一些问题,...)

(我已经尝试使用高精度计时器来测量时间,但由于差异只有 4-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

关于assembly - 如何测量执行的汇编指令的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16312270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com