Board logo

标题: [溢出][转帖]window系统下的远程堆栈溢出----shellcode疑难问题 [打印本页]

作者: 青蛙    时间: 2007-1-20 20:00     标题: [溢出][转帖]window系统下的远程堆栈溢出----shellcode疑难问题

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一次奏效。这一点我还没有想好怎么办。 以下是测试时候使用的代码: 如果你有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: "<



欢迎光临 黑色海岸线论坛 (http://bbs.thysea.com/) Powered by Discuz! 7.2