Lua - 如何欺骗GetFenv函数而不改变它?

我有一些代码想要找出其中的漏洞,我已经编写了代码,如果您能帮我找到它,我将不胜感激。

我唯一的关注点是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。

如果您能向我解释一下如何欺骗这样一个函数和/或如何修补这个函数上的欺骗,而不改变它自己的任何数据,我将非常高兴!

点赞
用户2774950
用户2774950

我假设这段代码是在攻击者/作弊者的机器上运行的。从根本上讲,没有办法保证客户端代码的安全性。您的检查可以被删除,您的检查检查也可以被删除。即使是Lua二进制本身也可以在内部更改,并且getfenv可以更改以执行除其本身以外的任何操作。在服务器和客户端逻辑之间实施强大的边界是确保应用程序安全的唯一真正方法。

在这种情况下可能发生的一种攻击是,如果客户端在设置好func_table之前在同一个lua_State中运行Lua代码。在这种情况下,他们可以像我在这里找到的那样对您进行沙箱处理。

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

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

由于您正在使用wait(),我假设您正在Roblox中运行此代码。在这种情况下,正如我在他们的开发者论坛上强调的那样,experimental mode(以前是filtering enabled)设置是保护游戏免受攻击者威胁的唯一方法。这可以大多数时候防止客户端编辑游戏。他们仍然可以完全控制自己的角色位置、一些其他实例类型(如帽子),可以通过RemoteEvent和RemoteFunction实例请求服务器进行更改,并且可以进行透视墙(设置墙透明度)(为了对抗这种情况,只向客户端发送它可以看到的部分)。

2019-01-24 07:49:12