Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是保护Lua免受缓冲区过度读取?_Lua - Fatal编程技术网

什么是保护Lua免受缓冲区过度读取?

什么是保护Lua免受缓冲区过度读取?,lua,Lua,我一直在浏览Lua的源代码。我已经知道VM从哪里得到下一条指令。它是vmfetch宏的 #define vmfetch() { \ i = *(ci->u.l.savedpc++); \ if (L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) \ Protect(luaG_traceexec(L)); \ ra = RA(i); /* WARNING: any stack reallocation i

我一直在浏览Lua的源代码。我已经知道VM从哪里得到下一条指令。它是
vmfetch
宏的

#define vmfetch()       { \
  i = *(ci->u.l.savedpc++); \
  if (L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) \
    Protect(luaG_traceexec(L)); \
  ra = RA(i); /* WARNING: any stack reallocation invalidates 'ra' */ \
  lua_assert(base == ci->u.l.base); \
  lua_assert(base <= L->top && L->top < L->stack + L->stacksize); \
}
#定义vmfetch(){\
i=*(ci->u.l.savedpc++)\
if(L->hookmask&(LUA_MASKLINE | LUA_MASKCOUNT))\
保护(luaG_traceexec(L))\
ra=ra(i);/*警告:任何堆栈重新分配都会使“ra”无效*/\
lua_assert(base==ci->u.l.base)\
lua_断言(基本顶部和底部->顶部堆栈+L->堆栈大小)\
}

但是,我在
vmfetch
或检查
ci->u.l.savedpc++
是否实际是有效地址中找不到任何代码。是什么阻止Lua意外地在某个随机地址执行数据?

保护处于编译阶段。在字节码生成过程中,如果块中没有终止符,则无法构建块


允许用户在没有任何“信任”的情况下添加已编译的lua是一个漏洞。像《魔兽世界》这样的游戏允许用户lua只接受源代码,以确保他们能够控制编译过程。

我认为没有任何东西可以保护lua免受这种情况的影响。VM跟踪块指令和跳转点。它也不提供允许外部源修改其指令数据的方法。因此,考虑到这一点,它应该是非常安全的。正如Lua手册所说,“Lua不会检查二进制块的一致性。恶意创建的二进制块可能会使解释器崩溃。”因此,为了确保环境安全,您应该禁用
调试
库,并禁止加载用户字节码。从Lua源创建的字节码被认为总是正确的。