需要解释特定的安全优化

时间:2013-07-19 06:35:27

标签: c++ c security assembly disassembly

我正在阅读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,因此甚至可以被编译器删除?

这是一种拼写错误还是错误?或者我没有得到什么?

2 个答案:

答案 0 :(得分:7)

这是你的错,不是克里斯。这不是“用户验证代码的安全版本”,但这是黑客引入修正后获得的代码

从这本书中引用俄语:

  

НаязыкеСиисправленная   программабудетвыглядетьтак:

谷歌翻译:

  

C语言修改(或修补)程序将会显示   像这样:

答案 1 :(得分:1)

作者希望在C中显示那种代表无条件跳转(JMP continue)的“等效”代码,用JZ continue替换原始密码的检查。你是对的,这个代码(在C中)没有任何意义,但只是为了说明黑客做了什么。