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 倍。这是一个相当粗略的粒度,因此通过使用相同的密码进行多次尝试应该很容易平均。
| 归档时间: |
|
| 查看次数: |
9069 次 |
| 最近记录: |