2017年9月30日星期六

【游戏安全】看我如何通过hook攻击LuaJIT

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
【游戏安全】看我如何通过hook攻击LuaJIT  阅读原文»

2017-09-29 15:54:49 阅读:3525次 收藏 来源: nickcano.com 作者:�d趣使然的小胃

http://pic1.hackdig.com/pp/d2bd8ab8780efecdb70a25b22e968ceec69409b0ebdb879fc7e9995fd5bb6b40fdbc7c4d54cc05c14d764cd0552fcd73.jpg

译者:�d趣使然的小胃

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


一、前言


如果你在游戏行业摸爬滚打已久,你肯定听说过Lua这个名词。作为一门强大的脚本语言,Lua已经嵌入到数千种视频游戏中,提供了各种API接口,以便工程人员在游戏客户端以及服务器上添加各种功能。

我会不断强调一个观点:为了让攻击技术更加便捷、更加可靠以及更加高效,最好的方法就是攻击游戏引擎,而不是攻击游戏本身。Hook一大堆函数、定位一大堆地址本身是个很好的办法,然而这意味着只要游戏更新版本,你就需要更新你所使用的偏移量。相反,如果你hook了游戏使用的那些库,这些问题就会迎刃而解。

Lua的普及性使得它成为hook的理想目标。此外,由于游戏开发者使用Lua来添加内容及功能,因此游戏所包含的Lua环境就成为拥有大量功能的强大主机环境。

出于性能要求,使用LuaJIT来替代vanilla Lua是非常常见的场景。因此,在本文中我会探讨如何攻击LuaJIT。只要稍作修改,这种攻击技术也可以应用于vanilla Lua。


二、注入Lua代码


为了创建Lua环境,我们需要调用luaL_newstate返回一个lua_State对象,然后将其作为参数,调用luaL_openlibs即可。有人可能想通过劫持luaL_newstate的执行来注入代码,然而这种方法并不能奏效。因为此时程序库还没有加载,因此加载脚本不会起到任何作用。然而,我们可以劫持luaopen_jit函数,这个函数正是打开程序库时所调用的最后一个函数(参考此处)。

动态链接LuaJIT时,我们可以查找导出表来定位这个函数:

http://p1.qhimg.com/t01e5fd413bc1fc0df0.png

静态链接LuaJIT时,我们可以使用一些特征字符串来进行定位:

http://p9.qhimg.com/t01269755b2029eba06.png

一旦找到这个函数,hook就不是件难事。然而,在hook之前,我们需要找到两个函数:luaL_loadfilex这个函数用来加载我们的Lua脚本,lua_pcall这个函数用来执行Lua脚本。动态链接时,我们可以在导出表中找到这两个函数;静态链接时,我们可以使用"=stdin"字符串来定位第一个函数(参考此处):

http://p4.qhimg.com/t019ae20ae15c7cbe7e.png

定位第二个函数需要多费点功夫,因为该函数没有关联某个特征字符串。然而幸运的是,该函数在内部调用时(参考此处),位于"=(debug command)"之后:

http://p8.qhimg.com/t01b96bfffab9e4a0ec.png

注意,上图中我们还能观察到luaL_loadbuffer函数的地址,牢记这一点,回头要用到。

识别出这些地址后,我们就可以开始写hook代码了:

typedef void* lua_State;

typedef int (*_luaL_loadfilex)(lua_State *L, const char *filename, const char *mode);
_luaL_loadfilex luaL_loadfilex;

typedef int (*_luaopen_jit)(lua_State *L);
_luaopen_jit luaopen_jit_original;

typedef int (*_lua_pcall)(lua_State *L, int nargs, int nresults, int errfunc);
_lua_pcall lua_pcall;

int luaopen_jit_hook(lua_State *L)
{
    int ret_val = luaopen_jit_original(L);
    luaL_loadfilex(L, "C: est.lua", NULL) || lua_pcall(L, 0, -1, 0);
    return ret_val;
}

BOOL APIENTRY DllMain(HMODULE mod, DWORD reason, LPVOID res)
{
    switch (reason) {
    case DLL_PROCESS_ATTACH: {
            luaL_loadfilex = (_luaL_loadfilex)LOADFILEEX_ADDR;
            lua_pcall = (_lua_pcall)PCALL_ADDR;
            HookCode(OPENJIT_ADDR, luaopen_jit_hook, (void**)&luaopen_jit_original);
            break;
      &nbs
庆国庆迎中秋|胜"券"在握,好课限免!  阅读原文»

一年一度祖国麻麻的生日到了,普天同庆,为了表达同胞之间深深的手足之情,牛妹决定,给安全牛课堂小伙伴儿们送大大大福利!!!

9月29日至10月8日,安全牛课堂两大福利给祖国麻麻庆生!前方高能,请留神!

活动一:200元无门槛优惠券大放送!
(课程、班级、Security+直播培训及会员均可使用)

活动二:8门精品课程限时免费!

国庆课程限免名单如下:

1. SQLMAP实战

课程链接:

https://edu.aqniu.com/course/383

2. APPSCAN

课程链接:

https://edu.aqniu.com/course/666

3. TCPDUMP

课程链接:

https://edu.aqniu.com/course/737

4. OWASP_ZAP

课程链接:

https://edu.aqniu.com/course/733

5. BURP SUITE

课程链接:

https://edu.aqniu.com/course/732

6. AWVS

课程链接:

https://edu.aqniu.com/course/667

没有评论:

发表评论