首页
社区
课程
招聘
[原创]利用溢出漏洞绕过游戏保护程序的思路,请高手指点~
2008-5-18 16:39 12006

[原创]利用溢出漏洞绕过游戏保护程序的思路,请高手指点~

2008-5-18 16:39
12006
利用溢出漏洞绕过游戏保护程序的思路

现在的反外挂游戏一般都有游戏保护程序(其中以"NX"最为著名-_-")保护,NX对游戏的保护可谓铜墙铁壁,我们硬碰硬地去与其较量,使用外部程序读写游戏数据,多半非死即伤(牛人请飘过-_-),在此,本人分享一个思路:让我们的程序成为游戏进程的一部分,游戏保护程序防外不防内,绕过保护使其沦为华丽丽的马其诺防线。。。。
我的想法有2个,希望高手多多指点,

一:利用DLL劫持技术,由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件。首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。甚至你可以伪造一个游戏程序的同名DLL,程序运行加载你的DLL,干完你想干的事后再转发给原DLL。

二:利用游戏本身的溢出漏洞,编写ShellCode使游戏进程加载我们的DLL文件,较之前者而言,这个办法使游戏开发者很难防范,游戏开发者很难保证自己的程序没有溢出……..

下面用一个简单的示例演示一下利用游戏本身的溢出漏洞加载DLL:
演示道具:  
1: ExpolitMe.exe 我们假设该程序是有漏洞的游戏程序,其在加载配置文件key.dat时会导致缓冲区溢出。
2: t.dll 我们想让程序加载的DLL文件,可以通过该文件实现读写程序内存,我的示例只是弹出一个对话框提示加载成功.
3: key.dat 和游戏程序处在相同目录下,游戏会读取该文件的内容,导致缓冲区溢出,我们的shellcode会写在key.dat里.
文中示例程序我放在
http://www.fs2you.com/files/f6f390dc-24b5-11dd-82d0-0014221f3995/

通过分析得知, ExpolitMe.exe在0040108E 处调用fscanf将导致堆栈缓冲区溢出,OK,下面的工作就是编写ShellCode加载DLL.
这个ShellCode 只需要完成几个功能:
1:得到kernel32.dll模块的基地址,继而得到 LoadLibraryA函数的地址
2:调用LoadLibraryA 加载DLL
3:善后工作

给出一个我写的一个shellcode,因为自己对shellcode研究不深,写得粗糙,高手见笑了..
代码如下:
由于SHELLCODE中不允许出现0DH,0CH 20H等空字符,所以代码有些地方需要处理,
比如
mov     eax,         [eax + 0x0c],
可以写成                lea                ecx,[eax + 0x06]
                lea                ecx,[ecx + 0x06]
                mov                eax,[ecx]
类似这样进行微调….
__asm
{
//得到LoadLibraryA的地址:
                mov     eax, fs:[0x30]          ;//PEB
               mov     eax, [eax + 0x0c]         ;//LDR_DATA
             mov     eax, [eax + 0x0c]       
                mov     eax, [eax]
                mov     eax, [eax]
                mov     esi, [eax + 0x18]
                mov     ebx, esi                    ;//Get kernel32.dll
                mov     eax, [esi + 0x3c]
                lea      esi, [esi + eax]         ;// esi->nt header
                add     esi, 0x78                  ;// esi->data export
                mov     esi, [esi]  
                lea      esi, [ebx + esi]
                mov     edx, esi                 ;// edx save export info
                mov     esi, [esi + 0x20]         ;// esi = function name array
                lea     esi, [ebx + esi]
                mov     edi, esi
                mov     ecx, -1
SEARCH:
                inc     ecx
                mov    esi, [edi + ecx*4]         ;// Get fun name
                lea     esi, [ebx + esi]
        push edi      
        xor edi,edi
        cld
Counthash:                        ;//用HASH值查找LoadLibraryA
        xor eax,eax
        lodsb
        cmp al,ah
        jz STRINGOVER
        ror edi, 7h
        add edi,eax
        Counthash
STRINGOVER:                          
        cmp edi, 0x0c917432   ; //LoadLibraryA 的HASH: 0x0c917432               
pop edi
        jnz SEARCH       
        mov     eax, [edx+1ch]
        add     eax, ebx
        mov     eax, [eax + ecx*4]
        add     eax, ebx        ;//OK,我们终于得到了LoadLibraryA的地址

        //给LoadLibraryA准备参数,由于esp稳定,利用esp定位参数
        lea         esi, dword ptr ss:[esp+7B]
        push        esi   
        call        eax                // 调用LoadLibraryA加载
        ret
        //我们在这里放上要加载的DLL文件名,作为LoadLibraryA的参数
           db       ‘t.dll’,0
}

经过去除0CH 0DH 20H 等空字符的处理,我们得到shellcode

char ShellCode[] =
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x99\x90\x90\x90\x12\x45\xFA\x7F"
"\x64\xA1\x30\x00\x00\x00\x8D\x48"
"\x06\x8D\x49\x06\x8B\x01\x8D\x48\x06\x8D\x49\x06\x8B\x01\x8B\x00"
"\x8B\x00\x8B\x70\x18\x8B\xDE\x8B\x46\x3C\x8D\x34\x06\x83\xC6\x78"
"\x8B\x36\x8D\x34\x33\x8B\xD6\x8D\x4E\x1B\x8D\x49\x05\x8B\x31\x8D"
"\x34\x33\x8B\xFE\xB9\xFF\xFF\xFF\xFF\x41\x8B\x34\x8F\x8D\x34\x33"
"\x57\x33\xFF\xFC\x33\xC0\xAC\x3A\xC4\x74\x07\xC1\xCF\x07\x03\xF8"
"\xEB\xF2\x8D\xBF\x00\x00\x00\xF7\x81\xFF\x32\x74\x91\x03\x5F\x75"
"\xD8\x8B\x42\x1C\x03\xC3\x8B\x04\x88\x03\xC3\x8D\x74\x24\x7B\x56"
"\xFF\xD0\xC3\x74\x2E\x64\x6C\x6C\x00";

我们设计的key.dat如下:
其中红色字体标注的7F FA 45 12为 JMP ESP的地址
蓝色字体8D 74 24 7B 56 FF D0 是调用LoadLibraryA的代码:
lea                 esi, dword ptr ss:[esp+7B]
push                esi
call        eax
红色字体标注的C3是我简略的善后代码
蓝色字体标注的74 2E 64 6C 6C 00为 LoadLibraryA的参数 “t.dll”

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
00000000   90 90 90 90 90 90 90 90   90 90 90 90 90 90 90 90   
00000010   90 90 90 90 90 90 90 90   90 90 90 90 90 90 90 90   
00000020   99 90 90 90 12 45 FA 7F   64 A1 30 00 00 00 8D 48  
00000030   06 8D 49 06 8B 01 8D 48   06 8D 49 06 8B 01 8B 00
00000040   8B 00 8B 70 18 8B DE 8B   46 3C 8D 34 06 83 C6 78
00000050   8B 36 8D 34 33 8B D6 8D  4E 1B 8D 49 05 8B 31 8D
00000060   34 33 8B FE B9 FF  FF  FF   FF 41 8B 34 8F 8D 34 33
00000070   57 33 FF FC 33 C0 AC 3A   C4 74 07 C1 CF 07 03 F8
00000080   EB F2 8D BF 00 00 00 F7   81 FF 32 74 91 03 5F 75  
00000090   D8 8B 42 1C 03 C3 8B 04  88 03 C3 8D 74 24 7B 56
000000A0   FF D0 C3 74 2E 64 6C 6C  00            
         
OK,我们来测试一下,写好key.dat,拷贝DLL到ExpolitMe.exe 文件目录下,
打开ExpolitMe.exe
提示 弹出对话框“加载成功!”(我的DLL会在加载后弹出对话框“加载成功!”)
由于本文重在思路分享,例子给的简陋了些,各位应该能写出更精致的shellcode和DLL吧-_-~

文中示例程序我放在
http://www.fs2you.com/files/f6f390dc-24b5-11dd-82d0-0014221f3995/

本文得到backer老师指点,在此表示感谢….顺便给backer老师的网站打个小广告
http://www.51asm.com/

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
免费 7
打赏
分享
最新回复 (30)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
漂魂 2008-5-18 17:47
2
0
强悍,第一贴就来个精华。支持

看不懂ing!~
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2008-5-18 18:10
3
0
标题请改为一个简单的ExploitMe分析。
雪    币: 124
活跃值: (70)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
jskew 1 2008-5-18 19:34
4
0
同意楼上的
雪    币: 214
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Gunjovi 1 2008-5-18 20:13
5
0
因为只是分享下思路,所以给的例子确实简单了些,见笑了........
雪    币: 75
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bird 2008-5-19 01:54
6
0
傻呀。将*.DLL 放在system32 目录
在写注册表"AppInit_DLLs"="DLL.dll"

这样修改客户端就OK了。
雪    币: 1946
活跃值: (238)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
Bughoho 8 2008-5-19 04:34
7
0
箱——神——
雪    币: 716
活跃值: (162)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
elance 6 2008-5-19 09:05
8
0
过来学习一下。
雪    币: 8201
活跃值: (4308)
能力值: ( LV15,RANK:2459 )
在线值:
发帖
回帖
粉丝
ccfer 16 2008-5-19 09:16
9
0
文不对题啊。
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
sessiondiy 4 2008-5-19 09:23
10
0
看呒

7878
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gdlian 2008-5-19 19:58
11
0
第一点很好防范,第二点,有个关键,溢出漏洞就那么好找吗?
雪    币: 282
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
somuch 1 2008-5-19 21:46
12
0
需要这么麻烦么
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
zhuwg 11 2008-5-19 21:51
13
0
应该不需要,。直接想点办法注入dll就好咯
雪    币: 7300
活跃值: (3758)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
海风月影 22 2008-5-19 22:03
14
0
我以为是NX的什么漏洞。。。
原来不是NX的漏洞
是ExploitMe的漏洞
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 24 2008-5-19 22:18
15
0
这个思路比较新颖的,游戏那么多ws文件,格式都不一样,难免保证没漏洞,可能以后比较有用
雪    币: 1946
活跃值: (238)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
Bughoho 8 2008-5-19 22:23
16
0
经高人指点游戏的本地漏洞是毫无用处的.
雪    币: 211
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
百家拳 2008-5-19 22:46
17
0
只是一个利用漏洞完成注入的思路
雪    币: 211
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
百家拳 2008-5-19 22:46
18
0
lz好像没指望利用本地漏洞对服务器下黑手,只是一个利用漏洞完成注入的思路,可能要等到保护软件限制了各种注入手段以后,这种利用游戏本身漏洞完成注入才会有意义,不过就现在而言,这样做注入不方便。
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2008-5-19 22:55
19
0
说好的用脑子想一下注入干嘛要绕这个弯子
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
zhuwg 11 2008-5-19 22:57
20
0
要远程溢出才有作用把
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2008-5-21 09:14
21
0
挺好的,怎么说也注进去了。又不用跟全世界的防外挂系统作对
支持下!
雪    币: 356
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stupidass 2008-5-22 13:04
22
0
有点无语了,本来出门倒左手就到的,结果一定要在门口坐个公车,往前直走N站,下来后再打个的回来.......楼主不认识路?
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
Aker 4 2008-5-22 18:12
23
0
哎,backer,拼错了哦
雪    币: 1946
活跃值: (238)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
Bughoho 8 2008-5-22 18:19
24
0
如果把a和c替换一下再加个空格。。。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhucheba 2008-5-23 17:03
25
0
认真学习一下
游客
登录 | 注册 方可回帖
返回