windows堆栈段的疑惑~

1.我写了一个溢出程序,简单的win32的,打开OD后,直接去看内存的堆栈段:

发现堆栈段并不是可执行的,但是却可以通过溢出执行栈中的代码。这是什么原因?
2.从上面看windows(我是XP的)的栈段是可执行的,这样不是会有安全隐患么~

   我查了下好像linux后面就不允许栈段执行了,windows保留这个可执行的原因是什么?

1.来个看雪某位朋友的回答:

对于x86来说,只有代码段和数据段,“栈”的本质还是数据段,如果有看下寄存器,应该可以发现SS和DS是相同的,(内核态下可能会有所不同)。
假设有某个线性地址:0x00400000,你怎么能知道这个地址是属于哪个段的呢?CS,DS,ES, SS?你无法确定,因为这几个段都是4G空间的。你可以使用CS,DS,SS或者ES来访问它,即可以把它当做指令执行,也可以把它当作数据访问。你使用OD看到的段属性,仅仅是SS这个段的属性,如果使用CS段来访问这个地址,那你看到的就是代码段的属性了。这就是我前面所说的x86保护模式下段弱化的意思,但无论如何这个地址所属于的页是唯一的,所以才可以通过DEP来保护程序。你的问题段的意义何在?这是历史原因啊,谁让x86与生俱来有就有段的概念呢,不过到了x64时代,段的概念更被进一步弱化了。

2.第二个问题网上查的原因

应用程序和驱动程序都可能会发生DEP兼容性问题。
有些应用程序行为可能与DEP不兼容。执行动态代码生成(如实时代码生成)的应用程序以及不使用“执行”权限明确标记生成的代码的应用程序与DEP之间可能存在兼容性问题。

第二个问题是兼容性的原因。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值