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

时间:2018-09-23 07:38:10

标签: lua

我一直在浏览Lua源代码。我已经弄清楚了VM从哪里获得下一条指令。这是vmfetch宏的first line

#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); \
}

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

1 个答案:

答案 0 :(得分:4)

保护处于编译阶段。字节码生成在没有任何终止的情况下不会构建块。

允许您的用户添加编译后的lua,而无需任何“信任”是一个漏洞。诸如WoW之类的游戏-允许用户lua仅接受源代码,以确保他们可以控制编译过程。