“自愿上下文切换”到底是什么?


34

我得到了一个二进制文件,所以我应该破解它的密码(作业)。还提供了一个函数(该函数是二进制文件的一部分)。该函数表明,输入字符串与每个字符都与正确的密码字符进行比较,并且当一个字符错误时会立即返回false(这是不安全的方式,我猜这是因为它浪费了时间,并且我们知道正确的密码长度为例)。但是我们的老师添加了一个随机计时器,该计时器返回结果(正确/错误),这对我们来说有点困难...

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

/usr/bin/time -v ./program_name enter_password

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

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

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

我的问题是,“自愿上下文切换”到底是什么?为什么它们可以帮助我破解密码?


5
祝贺您自己发现了丰富但仍未完全了解的旁道攻击领域
zwol

1
@zwol“富”是什么意思?除此之外,我们目前正在处理类侧信道攻击,请原谅我,我没有“完全理解”,迅速的领域....
cnmesr

15
@cnmesr我将其视为真诚的评论,而不是讽刺的评论,他说zwol认为该领域是一个有趣的领域,因为仍有新发现。这并不是说没有完全理解它,而是没有人完全理解它,这就是使它变得有趣的原因。
高清

3
@hvd cnmesr是的,这就是我的意思。
zwol

@zwol哦,对不起!我误解了您,并将其视为攻击:p
cnmesr

Answers:


36

用于手册页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.

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

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


这与密码检查程序有何关系,取决于该程序实际执行的操作。

从注释中链接的源代码中,我们看到该程序usleep()为每个不匹配的字符调用一次,然后继续对下一个字符进行比较循环。睡眠与产生CPU一样具有自愿性,因此这些调用将显示为每个非匹配字符的自愿上下文切换。

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

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


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

@cnmesr,哦,太好了!
ilkkachu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.