Lua-我将如何欺骗GetFenv函数而不对其进行更改?

时间:2018-10-11 14:24:52

标签: security lua

我有一些代码想要在其中找到一个漏洞,我对此进行了编码,如果您能帮助我找到其中的任何内容,我将不胜感激。

我唯一的担心是getfenv可能以某种方式被欺骗。

coroutine.wrap(function()
    while wait() do
        for i, v in func_table.pairs(func_table) do
            if func_table.getfenv()[i] ~= v then
                return ban_func(10, 23)
            end
        end
    end
end)()    

需要明确的是,ban_func位于func_table内部,它将自动检测其数据更改并相应地禁止。我认为他们(作为开发者/作弊者)能够进行任何更改的唯一方法是通过欺骗getfenv。

如果您可以向我解释如何欺骗这种功能和/或如何在该功能上修补欺骗,而又不更改其自身的任何数据,我将非常高兴!

1 个答案:

答案 0 :(得分:0)

我假设这段代码正在开发者/欺诈者机器上运行。从根本上讲,没有办法保证客户端代码的安全性。您可以删除支票,也可以删除支票。甚至Lua二进制文件本身也可以在内部进行更改,并且getfenv可以进行更改以执行除其功能之外的任何操作。在服务器和客户端逻辑之间实现牢固的边界是确保应用程序安全的唯一真实方法。

在这种情况下,一种可能的攻击是,如果在设置func_table之前,客户端在相同的lua_State中运行Lua代码。在这种情况下,他们可以像我在here中找到的lua沙箱实现那样沙箱。

另一种攻击是利用元方法使func_table.getfenv()[i] ~= v返回true。可以通过使用rawequal,检查func_table.getfenv()[i]的类型或将原始函数用作真值表中的键并检查键func_table.getfenv()[i]上的表是否为真来检测到这一点。

另一种攻击方法是同时编辑全局状态和表。在更改函数的地址时,通常会更改对ram中该地址的所有引用,其中包括表内部的内部引用。

由于您使用的是wait(),所以我假设您正在Roblox中运行此代码。在那种情况下,正如我在他们的开发者论坛上所强调的那样,experimental mode(以前是filtering enabled)设置是确保游戏不受开发人员攻击的唯一方法。这样可以防止客户端大部分时间编辑游戏。他们仍然可以完全控制角色的位置,还有其他几种实例类型(例如我相信的Hats),可以要求服务器通过RemoteEvent和RemoteFunction实例进行更改,并且可以进行墙砍(设置墙透明度)(以应对这种情况,仅发送它可以看到的客户端部分。)