“自愿上下文切换”究竟是什么?

cnm*_*esr 38 command-line cpu process

我有一个二进制文件,我应该破解它的密码(作业)。还有一个给定的函数(一个函数是二进制文件的一部分)。该函数显示输入字符串与正确的密码逐字符进行比较,并在字符错误时立即返回 false(我猜这不是安全的方法,因为它正在泄漏时间,我们知道正确的密码长度为例子)。但是我们的老师添加了一个随机计时器来返回结果(正确/错误),这对我们来说有点困难......

无论如何,我已经通过逆向工程成功完成并获得了正确的密码。现在我在命令行中使用它:

/usr/bin/time -v ./program_name enter_password
Run Code Online (Sandbox Code Playgroud)

使用这个命令,我得到了很多信息,比如系统时间、交换、执行时间……但对我来说最有趣的是“自愿上下文切换”,因为我输入的密码字符越正确,“自愿上下文切换”就越少“我明白了!

我输入的错误字符越多,我得到的“自愿上下文切换”就越多。

仅通过输入该命令,输入字符并观察“自愿上下文切换”,我就花了将近两个小时来破解密码。只要 ONE 字符正确,“自愿上下文切换”就会减少 1。

我的问题,究竟什么是“自愿上下文切换”,为什么他们帮助我破解密码?

ilk*_*chu 37

手册页time解释了自愿和非自愿上下文切换的概念:

The resource specifiers [...] are:
   c      Number of times the process was context-switched involuntarily
          (because the time slice expired).
   w      Number of times that the program was context-switched voluntarily, 
          for instance while waiting for an I/O operation to complete.
Run Code Online (Sandbox Code Playgroud)

(引用来自我的 Debian 系统,链接的手册页文本略有不同)

也就是说,如果进程因为无事可做而离开 CPU(在等待外部事件发生时),则上下文切换是自愿的。不自觉的,如果它想继续一些计算,但操作系统决定是时候切换到其他一些进程了。


其中任何一项与密码检查程序的关系取决于该程序的实际操作。

从注释中链接的源代码中,我们看到程序usleep()对每个不匹配的字符调用一次,然后在下一个字符上继续比较循环。睡眠与让 CPU 获得的收益一样自愿,因此这些调用将显示为每个非机器字符的自愿上下文切换。

在 Linux 上,您也应该能够看到带有 的调用strace

最终延迟来自 的随机睡眠T * (rand() % 3),即常数的 0、1 或 2 倍。这是一个相当粗略的粒度,因此通过使用相同的密码进行多次尝试应该很容易平均。

  • 这是我上面提到的函数的源代码 https://pastebin.com/iTzheD4u 谢谢,我会看看 strace 的调用,希望能得到更多信息。关于随机计时器:如果密码长度错误,输出时间相同(非常非常快)并且随机计时器不会被执行。如果密码长度正确,则输出是随机的,因为执行了随机计时器。 (3认同)