Security Debug.setlocal()安全问题

Security Debug.setlocal()安全问题,security,debugging,lua,exploit,Security,Debugging,Lua,Exploit,debug.setlocal是否存在任何安全问题?如果是这样的话,请告诉我它是如何工作的。Lua线程运行在一个“堆栈”上,这个“堆栈”是一个项目列表,它构成了语言的大部分内存。从“全局”变量到表,所有内容都愉快地位于此列表中 创建局部变量并执行代码时,堆栈将如下所示: +---+-------+ | 1 | false | isAdministrator +---+-------+----------------+ | 2 | "malicious code here!" |

debug.setlocal是否存在任何安全问题?如果是这样的话,请告诉我它是如何工作的。

Lua线程运行在一个“堆栈”上,这个“堆栈”是一个项目列表,它构成了语言的大部分内存。从“全局”变量到表,所有内容都愉快地位于此列表中

创建局部变量并执行代码时,堆栈将如下所示:

+---+-------+
| 1 | false | isAdministrator
+---+-------+----------------+
| 2 | "malicious code here!" | Code
+---+---------------------+--+
| 3 | function loadstring |
+---+---------------------+--+
| 4 | function MaliciousCode |
+---+------------------------+
local a=“字母a”
现在,让我们假设我们是恶意代码。我们知道以下代码用于运行我们的程序:

本地isAdministrator=false
local Code=“此处存在恶意代码!”
加载字符串(代码)()
这意味着加载程序的堆栈看起来像这样:

+---+-------+
| 1 | false | isAdministrator
+---+-------+----------------+
| 2 | "malicious code here!" | Code
+---+---------------------+--+
| 3 | function loadstring |
+---+---------------------+--+
| 4 | function MaliciousCode |
+---+------------------------+
现在,让我们假设更改
isAdministrator
对我们有一些价值。让我们看看我们将如何做到这一点

1
我们需要让lua修改函数上方的“堆栈”。想象lua是一棵树,就像这样:

otherScript
 + loader
    + maliciousCode
此树中的每个步骤都有自己的堆栈,并且由于
debug
库,它上面的堆栈中的每个变量都可以“访问”它下面的堆栈

如果我们当前所在的“堆栈”是堆栈#1(始终为真) 然后调用当前函数的函数位于堆栈#2上(这几乎总是正确的)

现在,查看我们要更改的函数堆栈,
isAdministrator
位于插槽
1
,第一个插槽。因此,要改变这一点,我们必须:

debug.setlocal(2,1,true)
然后砰的一声
isAdministrator
现在为
true
。我们可以随意毁掉你的电脑

不要担心——有一种方法可以阻止这种情况。删除调试库非常容易:

local func=loadstring(“恶意代码!”)
塞芬夫(func{
--在这里,我们插入我们的baby函数可以使用的函数。让我们为它提供字符串、表格和数学库——它们非常安全
数学=数学,表格=表格,字符串=字符串,
--哦,让我们也给它“os.time”函数。
os={time=os.time}
})
func()

现在,func无法访问调试库,您可以放心地使用愚蠢的isAdministrator本地程序。

Lua线程在“堆栈”上运行,该堆栈是构成语言中大部分内存的项目列表。从“全局”变量到表,所有内容都愉快地位于此列表中

创建局部变量并执行代码时,堆栈将如下所示:

+---+-------+
| 1 | false | isAdministrator
+---+-------+----------------+
| 2 | "malicious code here!" | Code
+---+---------------------+--+
| 3 | function loadstring |
+---+---------------------+--+
| 4 | function MaliciousCode |
+---+------------------------+
local a=“字母a”
现在,让我们假设我们是恶意代码。我们知道以下代码用于运行我们的程序:

本地isAdministrator=false
local Code=“此处存在恶意代码!”
加载字符串(代码)()
这意味着加载程序的堆栈看起来像这样:

+---+-------+
| 1 | false | isAdministrator
+---+-------+----------------+
| 2 | "malicious code here!" | Code
+---+---------------------+--+
| 3 | function loadstring |
+---+---------------------+--+
| 4 | function MaliciousCode |
+---+------------------------+
现在,让我们假设更改
isAdministrator
对我们有一些价值。让我们看看我们将如何做到这一点

1
我们需要让lua修改函数上方的“堆栈”。想象lua是一棵树,就像这样:

otherScript
 + loader
    + maliciousCode
此树中的每个步骤都有自己的堆栈,并且由于
debug
库,它上面的堆栈中的每个变量都可以“访问”它下面的堆栈

如果我们当前所在的“堆栈”是堆栈#1(始终为真) 然后调用当前函数的函数位于堆栈#2上(这几乎总是正确的)

现在,查看我们要更改的函数堆栈,
isAdministrator
位于插槽
1
,第一个插槽。因此,要改变这一点,我们必须:

debug.setlocal(2,1,true)
然后砰的一声
isAdministrator
现在为
true
。我们可以随意毁掉你的电脑

不要担心——有一种方法可以阻止这种情况。删除调试库非常容易:

local func=loadstring(“恶意代码!”)
塞芬夫(func{
--在这里,我们插入我们的baby函数可以使用的函数。让我们为它提供字符串、表格和数学库——它们非常安全
数学=数学,表格=表格,字符串=字符串,
--哦,让我们也给它“os.time”函数。
os={time=os.time}
})
func()

现在,func无法访问调试库,您可以放心地使用您的愚蠢的
isAdministrator
本地程序。

此函数不能在沙盒环境中使用。此函数不能在沙盒环境中使用。