逆向工程可以绕过软件密码吗?

信息安全 逆向工程
2021-08-23 18:21:17

比方说,在任何软件(安装在客户端操作系统上)上,是否有可能以这种方式更改软件(即 Zip 密码),因此对于不正确的输入,它会重定向到正确的“结果”,例如:

在此处输入图像描述

是否可以更改软件逻辑来执行命令而不是另一个命令?如果是这样,那么没有什么可以防止破解?

4个回答

简而言之,是的,您可以修改可执行文件、使用调试器等来更改正在执行的代码的逻辑。

但是,这可能还不够。

要使用您的“.zip 密码”示例,受密码保护的档案使用密码来派生加密密钥。除非您提供正确的密码,否则生成的密钥将是错误的,即使您将其修改为使用错误的密钥,也无法成功解密 ZIP 文件。

另一种情况可能涉及以更高权限运行的 setuid 可执行文件。您可以在调试器下运行它,或者将其复制到您的用户帐户并进行更改,但这将实现的只是使用您的用户权限运行它,从而消除利用的可能性。

那么您对 ​​.zip 密码的看法并不准确。许多其他程序也使用的方法是始终运行解密算法并获得结果,甚至在程序达到“密码好坏”决定之前。诀窍是解密会在任何密码上产生垃圾,除了一个“神奇”(或者更确切地说 - 数学上)计算正确数据的好密码。所以程序不知道好的密码是什么。

您要破解的“好或坏”时刻仅检查结果是否为垃圾。覆盖它并没有太大的好处。

由于还没有人想出一个现实生活(非计算机相关)的例子,我会在这里尝试:

想象一下试图登机。你需要一张登机牌,否则安检人员不会让你通过。如果您可以访问系统并且可以修改它(假设您是 CEO),您可以绕过安全性吗?是的!你可以:

  • 删除安全人员(删除整个身份验证组件)
  • 要求伙计们让所有人进入(删除“如果乘客有有效登机牌”检查)
  • 如果有人出示了特殊的登机牌,请这些人给予访问权限(添加新的验证规则以允许伪造凭据)

现在,另一种情况:一堆保险箱存放在银行中。要打开保险箱,您需要一把物理钥匙来转动锁。

能拉上前一招吗?是的,你可以,但这无济于事。这不像站在那里的安全人员可以访问所有保险箱 - 他没有任何一个保险箱的钥匙。你可以打败他,但他不仅拥有打开锁所必需的东西(物理钥匙)。

您可以尝试撬锁(暴力破解),但这将非常耗时(现代加密密钥的数学表明您需要数十亿年才能解锁它,即使您拥有世界上所有的计算机)你)。所以你就在那里 - 在这个设计(数据加密)中,获取存储数据的唯一方法是使用密钥,这使得它无法绕过。

当然,软件可以做任何你编程它做的事情。

举个简单的例子,如果为我提供了一个检查密码的 Python 程序:

password = raw_input('Enter your password: ')
if password != 'oh-so-secret':
    sys.exit(1)

do_secure_thing()

我可以很简单地将其更改为不关心密码是什么:

password = raw_input('Enter your password: ')

do_secure_thing()

(在这种情况下,您也可以只查看硬编码的明文密码并输入它。)

对于二进制应用程序,您必须先对它们进行反编译,然后才能修改源代码,但是对于常用语言有很多反编译器。

这就是存在代码签名的原因。

现在,如果这不是您自己的系统,您的选择可能会更加有限。在大多数类 Unix 系统上,可执行文件通常以非 root 用户的只读和只执行权限存储;因此,如果您不是 root,则无法修改目标可执行文件。还有其他不太直接的方法可以尝试,但如果这些方法失败了,您正在考虑转移到不同的向量。

例如,键盘记录器将记录用户输入的密码,以便您以后自己重用它们。

另一种不需要修改程序源的攻击方法是修改动态库加载路径,使程序使用您编写的库调用,而不是它期望的调用。如果他们使用外部的、动态加载的库来管理密码,并且该库具有verify_password()返回布尔值的函数,则您可以编写自己的verify_password()始终返回 true 的函数,然后将其加载。

将答案从“是”变为“否”的真正区别在于密码是否实际上不是密码,而是加密密钥。如果数据被加密,那么任何外部程序做什么都无关紧要 - 在解密算法被提供正确的密钥之前,它仍然加密数据。