http://bbs.chinaunix.net/thread-1945526-1-1.html
《深入理解计算机系统》上有一个小练习,用来实验缓冲区溢出攻击系统。
/* $begin getbuf-c */
int getbuf()
{
char buf[12];
getxs(buf);
return 1;
}
void test()
{
int val;
printf("Type Hex string:");
val = getbuf();
printf("getbuf returned 0x%x\n", val);
}
题目要求输入一段16进制的数字,以改变getbuf函数的返回值。printf打出 "getbuf returned 0xdeadbeaf"
我的思路是,输入数据让缓冲区溢出,以修改栈里的getbuf函数返回地址,如下图:
经过具体实验,栈里的数据都能够通过缓冲区溢出修改成功,返回地址也没问题,但是当getbuf返回时,CPU执行到我修改后的返回地址上时,报出了段错误。如果将该返回地址改为代码段里的地址,就不会有问题。所以我在疑惑,是否栈里存储的代码有权限?换句话说,就是我把机器指令放在栈里,是否能够被CPU执行?