【发布时间】:2013-07-19 06:35:26
【问题描述】:
我正在阅读由 Kris Kaspersky 撰写的 book [rus](抱歉,我目前找不到英文版),其中解释了软件安全的理念和技术。
书中有一个例子。它指出代码:
if ( ! IsValidUser() )
{
Message("Invalid user! Abroting...");
Abort;
}
完全不安全,因为它被翻译成这样:
CALL IsValidUser
OR AX,AX
JZ continue
^^^^^^^^^^^^^
PUSH offset str_invalid_user
CALL Message
CALL Abort
continue: ; normal program execution
...........
因此,只要在反汇编程序中更改一个字节,就可以破解程序。如果我们将JZ continue 更改为JMP continue 将无法正确执行检查。
然后克里斯写道:
C 程序的修正版本是:
IsValidUser();
if (!true)
{
Message("Invalid user! Aborting...");
Abort;
}
在此版本中,{...} 部分将永远无法获得控制。
我真的不明白更正后的版本应该如何工作。为什么他使用一个永远不会执行的if-statement,甚至可以被编译器删除?
这是错字还是错误?还是我什么都没有?
【问题讨论】:
-
这要么是一个错字,要么这本书有点没用,因为它在谈论未优化代码。
-
@CodyGray 是我未能解释
the corrected version of the program的实际含义。事实上,这只是一个简单的例子,说明一些看似安全的代码实际上是如何完全不安全的。无论如何,了解您的程序可能被黑客入侵的潜在方式总是有用的。 -
“更正”如“补丁后的样子...
标签: c++ c security assembly disassembly