首页
社区
课程
招聘
[原创]0day第12.3.2章节--Ret2Libc实战之利用VirtualProtect
发表于: 2019-2-28 11:57 3630

[原创]0day第12.3.2章节--Ret2Libc实战之利用VirtualProtect

2019-2-28 11:57
3630

实验环境:
Windows xp sp3
VS2010

实验配置:
开启DEP,保证实验程序开启了!
图片描述
Release版本
禁用优化、禁用GS、禁用SafeSEH

核心思想:当程序开启DEP后,可以通过VirtualProtect函数修改内存属性,达到绕过DEP的目的
VirtualProtect函数:

注意:
参数中包含0x00,因此漏洞函数改为memcpy函数

1、实验程序
图片描述

2、找到VirtualProtect函数的地址
载入OD,查找->在所有模块中查找,输入VirtualProtect即可。因此布置好栈后,转入0x7C801AD9即可。
图片描述
我们知道只需更改[ebp+8]和[ebp+14]这两处即可。

3、由于溢出时EBP被破坏,因此先通过PUSH ESP,POP EBP,RETN修复EBP(和上次实验一样)。通过OllyFindAddr查找即可。我们选择0x5D1D8B85
图片描述

4、修改shellcode,

图片描述

发现执行完retn 0x4后,ESP刚好指向EBP+8的位置。

(1)于是想如果能找到mov [ebp],xx pop xx,pop xx,pop xx,retn指令或者mov [ebp],xx jmp xx 指令不就能修改ebp+8的值了吗?(为什么要pop?因为有两个参数我们不能动)但是这两种指令都找不到。
(2)如果让ESP下移4个字节,再执行push esp retn/jmp xx指令也可以。因此可使用retn指令将ESP下移4个字节而又不影响程序的控制;再使用push esp jmp eax,但需要将eax的指令修改一下。

1、使用OD插件OllyFindAddr->自定义寻找0xC3,找到retn的地址0x7dd02d4c
图片描述

由于OD找不到push esp jmp eax的地址,因此我使用Immunity Debugger中的mona插件寻找,使用如下命令,找到地址为0x77ebc6c6,截图忘了截了,反正找到了~
图片描述

3、修改shellcode

提问:中间需要插入4个字节的空字符。
答案:因为push esp pop ebp retn 0x4指令中,最后retn 后面紧跟0x4说明retn后,esp下移8个字节,因此需要填充4个空字节。

(1)加入push esp imp eax指令之前:
图片描述
(2)加入push esp imp eax指令之前:
图片描述
单步继续:
图片描述
单步继续:
图片描述
如图所示,此时已经修改EBP+0x8的值了!

接下来需要做两件事:
(1)修改eax的值,因为要跳转到eax,此时eax还是0x00000000
(2)修改EBP+0x14的值

第三阶段:修改EBP+0x14
思路:如果我们将ESP指向EBP+0x18,就可以通过push esp jmp eax指令来设置EBP+0x14的参数了。
此时ESP指向EBP+0X4,因此使用pop pop pop retn指令就能使ESP指向EBP+0X18了!

1、利用OllyFindAddr找到pop pop pop retn的地址0x76B1B0BD 注意不要pop esp ebp eax,因为这三个寄存器以后都要用
图片描述

2、有了这条指令如何让程序去执行呢?
思路:刚才我们知道,当程序执行到push esp jmp eax时,要跳转到eax,因此我们只需要将pop pop pop retn的地址赋值给eax即可。
如何赋值呢?使用pop eax即可。

利用OllyFindAddr找到pop eax retn的地址0x7D6EB7FD
图片描述

3、修改shellcode

OD载入:
图片描述

单步继续:
图片描述
图片描述
图片描述

因此接下来将跳转到VirtualProtect。因此接下来填充参数即可。

第四阶段:填充参数,运行VirtualProtect
接下来直接填写VirtualProtect的另外两个固定参数0x000000ff和0x00000040,接着继续调用push esp jmp eax

提问:为什么还需要增加这3行代码,即还需要进行push esp jmp eax而不是直接写VirtualProtect的地址呢?

加上这三行代码后……
图片描述

跳转到push esp jmp eax中,运行pop pop pop retn,最后运行到VirtualProtect
由于有进行了一次pop pop pop retn因此需要进行填充
图片描述
图片描述
图片描述

执行完virtualprotect后,
图片描述

运行完VirtualProtect,如何运行shellcode呢?

此时esp为0x0013ffa8,如果使用jmp esp然后将shellcode放到jmp esp不就可以了??

修改shellcode

由于执行完Virutalprotect之后,在retn之前,堆栈顶部是0x0013ffa8,而vitualprotect的地址我们布置在了0x0013ffa0,因此在jmp esp需要4字节的填充。
执行jmp esp之前:esp执行0x0013ffa8
图片描述

执行完jmp esp后:esp指向0x0013ffbc
图片描述

中间相差了16个字节,因此需填充16个字节。再布置shellcode.
Shellcode先用0x41414141代替
运行成功!
图片描述


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-3-1 14:13 被灿烂阳光编辑 ,原因:
上传的附件:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//