【问题标题】:How to block the reversing of an encrypted string?如何阻止加密字符串的反转?
【发布时间】:2014-07-07 02:35:40
【问题描述】:

我不知道这个问题是否适合 SO,但我还是发布了它,因为我很好奇是否有任何具体的解决方案。

我在我的游戏中使用 MySQL 连接器,以便提供可靠且持久的连接来存储和检索游戏中游戏服务器的服务器列表。 我必须使用 MySQL DLL,因此很明显我使用 MySQL 进行连接。

这样就好了,不过上周我的一个黑客朋友提出要测试我的加密(MySQL密码以加密形式存储,并在运行时解密),他成功获得了所有密码,只用了一个缺少一个字符。

他告诉我,他在其中一个 MySQL DLL 中搜索了 mysql_connect() 函数,并在运行时截获了代码。

我查看了this,但没有答案涵盖我的情况(正在提取密码字符串的位置),我开始担心在我的使用情况下使用 MySQL 是否是一个错误,但是我相信在任何程序中都可能发生同样的事情。

我可以防止这种类型的漏洞利用吗? 我的decrypt 函数应该返回字符串以外的内容,还是可以截取函数中的任何内容?

链接问题的答案之一是这样说的:

最简单的方法是使用 xor 或 rot-13 等微不足道的方法对其进行加密,然后在使用时即时解密。这将消除对它们的随意观看,但不会阻止任何有丰富经验的人倒车。

我假设黑客设法反转加密,以泄露密码。

大概代码:

string server = "crysiswars2.communication.zyboxinternational.com";
mysql_connect(server, decrypt("randomuser1"), decrypt("randompassword2"), decrypt("myport"));`

【问题讨论】:

  • 没有。你的黑客(你的朋友)只是简单地从调用堆栈中获取数据。此时解密已经完成。关于这个漏洞,他正在在盒子上有效地调试代码。一旦他在那里,你就无法阻止它。它是一种端点攻击(显然端点没有得到足够的保护。

标签: c++ mysql encryption


【解决方案1】:

加密可保护源与目的地之间传输中的数据。它不能防止端点受损。

您需要的是端点安全性。你的黑客朋友是如何获得运行代码的?那应该在服务器上。您不会不小心把 MySQL 代码放在本地执行的客户端代码中吧?

【讨论】:

  • 客户端需要 MySQL 代码,因为它需要检索服务器列表。我不知道除了 MySQL 还能用什么……
  • 将 MySQL 代码包装在 HTTP API 中。客户端现在执行一个简单的 HTTP GET。您的网络服务器有密码,但您的黑客无法修改服务器。并且修改 HTTP 客户端不会让他得到密码。
【解决方案2】:

嗯,基本上,DLL 注入 + mysql_connect 钩子 = 这就是攻击者如何从你自己的函数中获取已经解密的密码。 检查 mysql_connect 函数的第一个字节,如果它被钩住或没有呢? 如果第一个字节 == JMP 或其他任何不应该的字节,那么就不要调用该函数。

【讨论】:

  • 这只会阻止最天真的黑客。你认为你的检查代码会发生什么?对,第一条指令将被修补为RET。这种保护在 1970 年经常被打败,你必须很天真地在 2014 年使用。
  • 啊,嗯,这也是,如果是内联就NOP验证码。
  • 好吧,直接从客户端连接数据库是最糟糕的主意。
  • @jakubinf 当我告诉你关于使用 MySQL 时,我没有看到你警告我>.<.>
猜你喜欢
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多