6

我正在阅读 Kris Kaspersky 写的一本书[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 continueJMP continue检查将无法正确执行。

然后克里斯写道:

C中程序的更正版本是:

IsValidUser();
if (!true)
{
    Message("Invalid user! Aborting...");
    Abort;
}

在此版本中,该{...}部分将永远无法控制。

我真的不明白更正后的版本应该如何工作。为什么他使用if-statement永远不会执行的,甚至可以被编译器删除?

这是一种错字还是错误?还是我没有得到什么?

4

2 回答 2

7

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

这本书的俄语引述:

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

谷歌翻译:

C 语言修改(或修补)程序将如下所示:

于 2013-07-19T07:15:11.453 回答
1

作者想在 C 中展示一种“等效”代码,它代表无条件跳转 ( JMP continue) 将原始密码的检查替换为JZ continue。你是对的,这段代码(用 C 语言)没有意义,但它只是为了说明黑客做了什么。

于 2013-07-20T09:03:34.270 回答