构建栈帧绕过NX选项

预备知识

本实验要求实验者具备如下的相关知识。

一、栈帧

在高级语言中,当函数被调用时,系统栈会为这个函数开辟一个栈帧,并把它压入到栈里面。新开辟的栈帧中的空间被它所属的函数所独占,当函数返回的时候,系统栈会清理该函数所对应的栈帧以回收栈上的内存空间。
每个函数都拥有自己独占的栈帧空间,有两个特殊的寄存器用于标识栈帧的相关参数:
1.ESP寄存器,永远指向栈帧的顶端;
2.EBP寄存器,永远指向栈帧的底部。
在调用一个函数的时候,函数所需要的参数首先会依次被压入栈上,其次压入对应的返回地址,最后跳转到被调用的函数执行代码并开辟新的栈帧。新的栈帧的底部保存有EBP寄存器的值,基于EBP寄存器可以获取到被调用函数所需要的参数信息。

二、NX选项

NX即No-eXecute(不可执行)的意思,NX选项会将进程特殊区域的内存标记为不可执行,当CPU跳转到这些区域执行代码的时候便会产生异常,以阻止缓冲区溢出时直接在栈上执行恶意代码。
gcc编译器默认开启了NX选项,如果需要关闭NX选项,可以给gcc编译器添加-z execstack参数。在Windows下,类似的概念为DEP(Data Execution Prevention,数据执行保护),在最新版的Visual Studio中默认开启了DEP编译选项。

三、扩展阅读

关于栈帧、函数调用的具体实现过程、数据执行保护等知识点,可以参考学习《0day安全:软件漏洞分析技术(第二版)》一书中的相关章节。

实验目的

1)了解NX、栈帧的基本概念;
2)掌握NX选项的开启、关闭以及查看方式;
3)掌握基于栈帧构建绕过NX选项的方法。

实验环境

在这里插入图片描述
服务器:CentOS 6.5,IP地址:10.1.1.101
测试机:Windows XP,IP地址随机
辅助工具:GCC,Python,IDA Pro,PuTTY,checksec

实验步骤一

题目描述:
在CentOS服务器的/home/test/pwn/2目录下存放了pwn2、start_service.py两个文件,运行start_service.py即可启动pwn2程序并在服务器的9992端口上监听网络连接。
pwn2程序的副本同时存放在Windows XP实验机器的C:\CTF\PWN2\2目录下,请对pwn2程序进行分析,并编写漏洞利用代码来获取CentOS服务器的控制权限。

通过GCC编译选项控制NX的开启和关闭

在使用GCC编译源代码的时候,默认开启了NX选项,我们可以通过指定-z execstack参数来关闭NX选项。下面详细讲解通过GCC编译选项控制程序NX选项的开启和关闭。
首先,在Windows XP实验机

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值