我一直在浏览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); \
}
但是,我无法在vmfetch
或luaV_execute中找到任何代码来检查ci->u.l.savedpc++
是否实际上是有效地址。是什么阻止了Lua在某个随机地址上意外执行数据?
答案 0 :(得分:4)
保护处于编译阶段。字节码生成在没有任何终止的情况下不会构建块。
允许您的用户添加编译后的lua,而无需任何“信任”是一个漏洞。诸如WoW之类的游戏-允许用户lua仅接受源代码,以确保他们可以控制编译过程。