security - Lua - 我如何在不改变 GetFenv 函数的情况下欺骗它?

标签 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。

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

最佳答案

我假设这段代码正在漏洞利用者/作弊者的机器上运行。从根本上来说,没有办法保证客户端代码的安全。你的支票可以被删除,你的支票也可以被删除。甚至 Lua 二进制文件本身也可以在内部进行更改,并且 getfenv 可以更改为执行除其功能之外的任何操作。在服务器和客户端逻辑之间实现强大的边界是保护应用程序安全的唯一真正方法。

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

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

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

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

关于security - Lua - 我如何在不改变 GetFenv 函数的情况下欺骗它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52762560/

相关文章:

PHP "Remember Me"安全漏洞?

java - 如何根据用户登录隐藏某些功能?

iphone - 用户可以从iPhone应用程序中获取资源吗?

lua - 如何移动表格中的所有元素?

exception - 为什么错误消息中没有指定这个 undefined reference ?

parsing - LPeg 语法怪异

java - Play 安全!来自外部申请

security - 什么系统调用来阻止/允许/检查创建程序主管

lua - 使用Torch-hdf5将Tensor保存到Hdf5

string - 使用 Lua 模式匹配破折号和换行符