各函数在Windows各个系统的存在状况以下,其中(1)表明不存在,(2)表明将因为默认DEP策略设置而失败:
html
绕过DEP须要构造ROP链,ROP链的做用就是用一连串的gadgets来实现这些函数的调用关闭DEP保护,而后转到shellcode上执行。python
主机:kali
git
靶机:Windows XP Professional SP3
shell
软件:Immnunity Debugger、OllyDbg、shellcode.exe(漏洞程序)windows
shellcode.exe
是在网上找的一个漏洞程序,它的功能就是在启动时会在本地1000端口绑定socket并进行监听,当有用户链接而且用户发送大于64bytes的数据时,堆栈会发生溢出,从而产生攻击。在Windows XP SP3中,默认以Optin方式开启DEP,即仅将DEP保护应用于Windows系统服务和组件,对其余程序不予保护。shellcode.exe
是用户进程,天然也不会受到DEP保护:
安全
首先,咱们在没有DEP保护的状况下看程序可否成功溢出,在主机上进行nc监听,打开4444端口:
socket
而后在靶机中运行shellcode.exe
程序:
函数
编写Python攻击代码exploit.py,将返回地址覆盖为0x7FFA4512(jmp esp指令),发送shellcode到靶机,而后回连主机的4444端口,编写完成后运行:
测试
能够看到,经过缓冲区溢出攻击,此时主机上成功得到了xp的shell:
操作系统
如图所示,在控制面板中设置打开DEP:
重启靶机,再次运行shellcode.exe
,发现出错了:
使用OllyDbg进行调试,能够看到程序是成功溢出了并执行了jmp esp
指令(0x7FFA4512):
使用Immunity Debugger载入shellcode.exe
,而后能够查看当前程序加载的可执行模块:
在下方命令行处输入命令!mona rop -m kernel32.dll
在kernel32.dll
中进行扫描,查找完成后,会在IM Debugger的安装目录下生成报表文件,咱们打开rop_chains.txt
进行查看,找到SetProcessDEPPolicy的ROP链说明处,能够看到针对不一样语言有不一样的说明,有Ruby语言的、Python的、JavaScript等等,咱们找到Python对应的说明:
整个ROP链的最终构造结果是构造出一个特定的寄存器结果,就像上图所示的同样,由于咱们知道PUSHAD
是依次将EAX、ECX、EDX…ESI、EDI入栈,那么当咱们经过ROP链构造好各个寄存器并经过gadget执行PUSHAD RETN
后,此时堆栈的结构大概就是这个样子的:
RETN
指令的地址,而后会执行EBP处的SetProcessDEPPolicy函数,由于PUSHAD RETN
在shellcode的上一个位置,执行完后ESP会指向shellcode,当SetProcessDEPPolicy执行完毕后会直接转到咱们shellcode处执行(此时已经经过调用SetProcessDEPPolicy取消DEP保护了),因此通过分析能够看到咱们构造的具体的ROP链:0x????????, # POP EBP # RETN 0x????????, # ptr SetProcessDEPPolicy(“SetProcessDEPPolicy”的指针) 0x????????, # POP EBX # RETN 0x00000000, # dwFlags 0x????????, # POP EDI # RETN 0x????????, # ptr RETN(“retn指令”的地址) 0x????????, # POP ESI # RETN 0x????????, # ptr RETN(“retn指令”的地址) 0x????????, # PUSHAD # RETN
POP EBX; RETN;
,将EBX先赋值为0xffffffff,而后在找到INC EBX; RETN;
,这样两个gadget合在一块儿执行达到了咱们的目的。其实,刚才经过执行mona.py已经在IM Debugger安装目录下记录了一些小配件的地址,打开rops.txt
,经过查找咱们能够找到在0x7c87f30f
处找到咱们想要的ROP小配件:
这里,咱们能够从新在IM Debugger中利用mona.py
模块来进行特定指令的查找,retn
指令的机器码为\xc3
,咱们在命令行中输入!mona find -s '\xc3 -m kernel32.dll'
,命令执行完成后,结果会在IM Debugger安装目录下find.txt
文件中,以下图所示:
RETN
的gadget,其余gadget的寻找方法和这个相似,经过mona.py
最后找到的各个ROP gadget构成的ROP链以下所示:0x77bf4f42, # RETN 0x90909090, 0x7c80df32, # POP EBP # RETN 0x7c862144, # ptr to SetProccessDEPPolicy() 0x7c81ae28, # POP EBX # RETN [kernel32.dll] 0x00000000, # 0x00000000(dwFlags) 0x7c86ce63, # POP EDI # RETN [kernel32.dll] 0x77bf54c4, # ptr RETN 0x7c87b976, # POP ESI # RETN [msvcrt.dll] 0x77bf5502, # ptr RETN 0x77d23ad9, # PUSHAD # RETN [user32.dll]
shellcode.exe
在溢出点函数返回时是RETN 0x04
,所以我加入了前两个ROP gadget进行过渡,使得整个ROP链可以串起来。最后将构造的ROP链与最开始编写的Python攻击代码从新结合一下,构成新的攻击代码exlpoit_dep.py:
而后,咱们在系统开启DEP保护的状况下,使用新的攻击代码进行测试:
能够看到成功获得了shell,至此使用ROP攻击绕过Windows的DEP成功: