-
-
[原创]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直播授课