【问题标题】:Lua - How would I spoof the GetFenv function, without changing it?Lua - 我将如何欺骗 GetFenv 函数而不更改它?
【发布时间】:2019-01-24 15:49:12
【问题描述】:

我有一些代码我想找到其中的漏洞,我编写了代码,如果您能帮助我找出其中的任何内容,我将不胜感激。

我唯一担心的是 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。

如果您能向我解释如何欺骗这样的函数和/或如何修补该函数的欺骗,而无需更改其自身的任何数据,我将非常高兴!

【问题讨论】:

  • 你可以写信到func_table吗?
  • ?攻击者/作弊者可以编辑upvalues/注册表,这就是为什么我将ban函数添加到func_table中,这些值包括表、函数、用户数据、字符串。我可能想要

标签: security lua


【解决方案1】:

我假设这段代码是在exploiter/cheaters 机器上运行的。从根本上说,没有办法保证客户端代码的安全。您的支票可以被移除,您的支票支票也可以被移除。甚至 Lua 二进制文件本身也可以在内部进行更改,并且 getfenv 可以更改为除了它所做的之外还可以做任何事情。在服务器和客户端逻辑之间实现强边界是保护应用程序安全的唯一真正方法。

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

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

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

由于您使用的是wait(),我假设您正在 Roblox 中运行此代码。在这种情况下,正如我在他们的开发者论坛上所强调的那样,experimental mode(以前的filtering enabled)设置是保护您的游戏免受剥削者攻击的唯一方法。这可以防止客户大部分时间编辑游戏。他们仍然可以完全控制他们的角色位置,其他几个实例类型(我相信像 Hats),可以通过 RemoteEvent 和 RemoteFunction 实例请求服务器进行更改,以及墙黑客(设置墙透明度)(为了解决这个问题,只发送它可以看到的客户端部分)。

【讨论】:

    猜你喜欢
    • 2011-03-07
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2013-05-03
    • 2011-06-27
    相关资源
    最近更新 更多