堆栈中是否可执行?

hkk333 2008-12-15 03:54:59
在看CSAPP(Computer System:A Programmer's Perspective),中译<深入理解计算机系统>

看到 虚拟存储器一章,看到一个旁注:
执行许可和缓冲区溢出,说pentium页表条目缺少一个执行许可位,用来控制一个页面的内容是否可执行.缓冲区溢出攻击利用了这个漏洞,在用户栈上直接加载和运行代码.

不过,我在3.13章中调试一个用来了解缓冲区溢出攻击的小程序时, 试图转到栈中执行自己的代码总不成功,老是出现通用保护段错误.结果用别的办法勉强达到了练习要求.
环境 系统Red Hat Enterprise Linux 4,CPU E4300

虽然后来我估计可能是因为有个地方我搞错了才会这样. 但是我还是想知道,书上说的pentium页表条目(PTE)缺少执行许可位这个说法,在现在常见的CPU和操作系统(32位系统)的组合上是否存在?
用户栈是否确实是可执行,即使是现在较新的系统中也还是存在?

或者换个说法,pentium页表条目(PTE)缺少执行许可位的问题是否已经被解决了?
(虽然我觉得好象不是这样,不然怎么还常看到"某某漏洞会导致容易受缓冲区溢出攻击"- -)
...全文
301 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
SearchLife 2008-12-15
  • 打赏
  • 举报
回复
关注
toadzw 2008-12-15
  • 打赏
  • 举报
回复
栈上运行代码应该是冯·诺依曼结构带来的结果
最早的时候根本就没区分指令和数据
hai040 2008-12-15
  • 打赏
  • 举报
回复
baidu:
通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行被植入被攻击程序输入缓冲区的代码,这种技术被称为非执行的缓冲区技术。事实上,很多老的Unix系统都是这样设计的,但是近来的Unix和MS Windows系统为实现更好的性能和功能,往往在数据段中动态地放人可执行的代码。所以为了保持程序的兼容性不可能使得所有程序的数据段不可执行。但是我们可以设定堆栈数据段不可执行,这样就可以最大限度地保证了程序的兼容性。Linux和Solaris都发布了有关这方面的内核补丁。因为几乎没有任何程序会在堆栈中存放代码,这种做法几乎不产生任何兼容性问题,除了在Linux中的两个特例,这时可执行的代码必须被放入堆栈中:


1.信号传递


Linux通过向进程堆栈释放代码然后引发中断来执行在堆栈中的代码进而实现向进程发送Unix信号.非执行缓冲区的补丁在发送信号的时候是允许缓冲区可执行的.


2.GCC的在线重用


研究发现gcc在堆栈区里放置了可执行的代码以便在线重用。然而,关闭这个功能并不产生任何问题.只有部分功能似乎不能使用。非执行堆栈的保护可以有效地对付把代码植入自动变量的缓冲区溢出攻击,而对于其他形式的攻击则没有效果。通过引用一个驻留
的程序的指针,就可以跳过这种保护措施。其他的攻击可以采用把代码植入堆或者静态数据段中来跳过保护。
帅得不敢出门 2008-12-15
  • 打赏
  • 举报
回复
没研究过.会不会跟系统工作模式有关.
ysuliu 2008-12-15
  • 打赏
  • 举报
回复
不懂,帮顶!
AndrewITBOY 2008-12-15
  • 打赏
  • 举报
回复
我是来打酱油的...
lbh2001 2008-12-15
  • 打赏
  • 举报
回复
栈上运行代码应该是冯·诺依曼结构带来的结果
最早的时候根本就没区分指令和数据
lgccaa 2008-12-15
  • 打赏
  • 举报
回复
mark
ARLENE_YANG 2008-12-15
  • 打赏
  • 举报
回复
UP
threeleafzerg007 2008-12-15
  • 打赏
  • 举报
回复
up :(
xianyuxiaoqiang 2008-12-15
  • 打赏
  • 举报
回复
linux下啊。它的安全机制很强的。这个问题应该是被阻挡了。
  • 打赏
  • 举报
回复
up
星羽 2008-12-15
  • 打赏
  • 举报
回复
up :)
nullah 2008-12-15
  • 打赏
  • 举报
回复
up
changsheng230 2008-12-15
  • 打赏
  • 举报
回复
mark
bobye1230 2008-12-15
  • 打赏
  • 举报
回复
不懂...帮顶...
高手来解说``
lbjfeng 2008-12-15
  • 打赏
  • 举报
回复
帮忙顶下~~
hkk333 2008-12-15
  • 打赏
  • 举报
回复
差不多能了解了, 其实很久以前我就看过了,还是因为存储器分段的原因,SEG:OFFSET形式的地址,OFFSET就可以表示4GB地址空间了,SEG就能索引到某个GDT或者LDT表项(段描述符),找到对应的段说明和相关权限,比如段是否可执行.
所以即使页表项(PTE)没能限制执行权限,不过通过段描述符就能限制某个段,比如堆栈段是否可执行.

还是因为看的时候久了点,印象不清晰. 通过15楼和各位的说法,确认了一下自己想法,再找了一下看看,差不多确定了.
散分了.

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧