首页
社区
课程
招聘
[原创]Ret2Libc实战之利用ZwSetInformationProcess
发表于: 2019-3-14 22:50 9159

[原创]Ret2Libc实战之利用ZwSetInformationProcess

2019-3-14 22:50
9159

本实验是按照0day第十二章(数据与程序的分水岭:DEP)做的,实验过程基本一致,写下来当作笔记。不足之处还望各位指正!
这个实验是通过ZwSetInformationProcess来关闭进程的DEP从而实现在执行布置在stack上的shellcode

windows XP sp3 + VC++6.0(生成release版本,并且禁止优化!!!)
当然此实验是在开启系统的DEP下做的,不然直接用shellcode的起始地址覆盖函数的返回地址就可以达到执行shellcode的效果。

ZwSetInformationProcess()函数的参数如下:
Owl
按照书上的做法,各个参数的值设置为:
Owl
实验源代码:

实验的大致思路是通过对栈帧合理布局,使程序在执行完test()函数时去执行关闭DEP的指令,然后就可以跳到shellcode的起始地址执行shellcode了。执行结果:
图片描述

首先将弹出对话框的shellcode填充为176字节,然后用OD打开,使用插件查找MOV EAX, 1的地址,这里选择0X7C80DFFC来覆盖test()函数的返回地址。
图片描述

图片描述

重新编译后调试,可以发现test()函数会返回到MOV EAX, 1 RET,继续单步运行,执行完MOV EAX后会跳到关闭DEP的代码处。继续运行会出现access violation when writing to [9090908C],这是因为shellcode直接用0X90909090EBP给覆盖了,EBP-4=0X9090908C,这个地址是不能写的,所以执行到MOV DWORD PTR SS:[EBP-4],ESI时会报错。
图片描述

图片描述
接下来要在执行关闭DEP的代码之前要把EBP-4地址处修改为一个可以进行写操作的地址。可以使用PUSH ESP, POP EBP, RETN指令来修改EBP并且修改完后还能回收控制权。这条指令序列可以使用OllyFindAddr插件来查找,查找结果中的step3。这里选择的地址为:0X77F238FF
图片描述

重新编译后用OD打开调试,在test()函数返回处的汇编代码RETN 4处设置一个断点,F9运行到端点处后使用单步运行,当执行到关闭DEP的代码后返回的地方停下。观察此时寄存器的状态,当执行RETN 4的时候程序会从ESP(0X13FEBC)处取指令执行,但是这个地址存放的是0X00000004,也就是ZwSetInformationProcess()函数的第四个参数,也就是说在执行关闭DEP的代码的时候进行了PUSH操作,虽然成功关闭了进程的DEP但是已经失去了对程序的控制。
图片描述


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2019-3-15 18:53 被kanxue编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (5)
雪    币: 19
活跃值: (128)
能力值: ( LV9,RANK:146 )
在线值:
发帖
回帖
粉丝
2
这是什么书来着  告诉我一下名字 
2019-3-15 11:33
0
雪    币: 1196
活跃值: (73)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
你好,这本书叫《0day安全:软件漏洞分析技术》(第二版)
2019-3-15 17:32
0
雪    币: 1555
活跃值: (3103)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
4
这书不好买了,我12年买了一本,看了好几遍 很好的书
2019-3-15 21:41
0
雪    币: 1196
活跃值: (73)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5

上面的图不太清晰,这是pdf格式的文档,里面的图可以看清。

上传的附件:
2019-3-15 22:27
0
雪    币: 229
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
求问,找不到怎么办 pop retn n
2020-3-1 22:27
0
游客
登录 | 注册 方可回帖
返回
//