我正在阅读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
,因此甚至可以被编译器删除?
这是一种拼写错误还是错误?或者我没有得到什么?
答案 0 :(得分:7)
这是你的错,不是克里斯。这不是“用户验证代码的安全版本”,但这是黑客引入修正后获得的代码
从这本书中引用俄语:
НаязыкеСиисправленная программабудетвыглядетьтак:
谷歌翻译:
C语言修改(或修补)程序将会显示 像这样:
答案 1 :(得分:1)
作者希望在C中显示那种代表无条件跳转(JMP continue
)的“等效”代码,用JZ continue
替换原始密码的检查。你是对的,这个代码(在C中)没有任何意义,但只是为了说明黑客做了什么。