【问题标题】:Need an explanation of a particular security optimisation需要对特定安全优化的解释
【发布时间】: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


【解决方案1】:

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

这本书的俄语引述:

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

谷歌翻译:

C 语言修改(或修补) 程序将看起来 像这样:

【讨论】:

  • 谢谢。现在我懂了。克里斯写了the corrected version of the program in C is: ...。而且我误解了corrected这个词……我以前认为corrected的意思是secure
  • 使用未编辑谷歌翻译只能作为穷程序员的最后手段。
  • @SChepurin。你说的对。我的目标是表明 Kolyunya 没有仔细阅读本书的内容。那是一本专为他而写的俄语书籍中的一句话。为了政治正确,我添加了谷歌翻译。我认为这个问题和答案对任何人都不感兴趣,但只有 Kolyunya。很抱歉谷歌翻译质量不好。
  • @SergV 实际上我确实仔细阅读了这本书,但 CORRECTED version of the program 这个短语是模棱两可的。例如。我确实误解了它的意思。
  • @SergV- 实际上,我认为这个问题对许多人来说可能很有趣,因为汇编的技巧就像编程的古老历史,但了解高级代码背后发生的事情是必须的高级程序员(我希望每个人都在努力成为)。我的评论是关于谷歌翻译的文本对于说外语的人来说很难理解的问题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2015-06-27
    • 1970-01-01
    • 2019-01-28
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多