预备知识
本实验要求实验者具备如下的相关知识。
一、栈帧
在高级语言中,当函数被调用时,系统栈会为这个函数开辟一个栈帧,并把它压入到栈里面。新开辟的栈帧中的空间被它所属的函数所独占,当函数返回的时候,系统栈会清理该函数所对应的栈帧以回收栈上的内存空间。
每个函数都拥有自己独占的栈帧空间,有两个特殊的寄存器用于标识栈帧的相关参数:
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实验机