首页
社区
课程
招聘
windows堆栈段的疑惑~
发表于: 2012-5-11 20:25 6170

windows堆栈段的疑惑~

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

发现堆栈段并不是可执行的,但是却可以通过溢出执行栈中的代码。这是什么原因?
2.从上面看windows(我是XP的)的栈段是可执行的,这样不是会有安全隐患么~
   我查了下好像linux后面就不允许栈段执行了,windows保留这个可执行的原因是什么?

希望得到解答~~谢谢~

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
  • 2.jpg (7.42kb,191次下载)
收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 297
活跃值: (265)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
2
楼主看下dep相关东西吧,栈中数据不能执行需要cpu和操作系统的支持
2012-5-11 20:44
0
雪    币: 96
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢evilor,看了dep的东东,第二个问题明白了,但是还是不清楚第一个问题~OD看到的栈段内存权限是不可执行的,可是本机测试溢出程序还是能成功,shellcode执行了,不知道是什么原因~
2012-5-11 21:06
0
雪    币: 31
活跃值: (48)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
我有点不明白具体细节,如果有权限写对方的栈,起码对方不会比你的权限高,那么让对方来执行和自己去执行有什么区别呢?隐藏的话远线程注入就够了吧?
2012-5-12 07:27
0
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主,推荐你去看下PE结构方面的知识
你就知道是什么原因了
在这里三言两语也说不透彻
看完PE你就知道堆栈数据到底放哪里了
2012-5-12 08:54
0
雪    币: 96
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
请说说吧。。PE我之前就看过了,到没发现能解决我第一个问题的解释。。这边是堆栈的数据,PE映射到内存里面跟堆栈不是一个地方的吧。。
2012-5-12 09:50
0
雪    币: 96
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不是很清楚你的意思。。
2012-5-12 09:52
0
雪    币: 142
活跃值: (310)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
8
一个内存段 能不能执行 看页面的属性 可读可写可执行,堆栈也只是一小块内存. 溢出 只是改变了EIP的指向。
2012-5-12 10:52
0
雪    币: 96
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
可能我没描述清楚吧。。我的问题就是用OD看是不可执行的,但是实际却能够执行。。这个矛盾的原因。。
2012-5-12 12:11
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
不明白第二个问题的答案是什么?

关于第一个问题,可以这样理解,PE文件分成很多节,比如.text,.data等,这些不同的节映射到不同的段,比如数据段,代码段,我的印象中x86只有代码段和数据段,没有栈段这一说法,你说所的“栈”段实际上就是数据段。对于数据段来说,权限肯定是不可执行的。

关于x86的段的信息,可以参考:http://user.qzone.qq.com/31731705/blog/1307847866

至于你说的为什么代码可以执行,CPU执行的时候直接使用CS:EIP,直接就执行了。对于段来说,段没法来保证代码的执行与否,因为x86中的段的概念已经弱化了,执行的权限只能放在页这个级别上,但即使有DEP的,也需要OS的配合,需要OS把相关的页标记。OS缺省不会对所有的进程做这样的操作。
2012-5-12 13:55
0
雪    币: 96
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
第二个问题的答案我查阅了应该是兼容性和动态代码生成,以及其他部分优化。
我这边说的段确实是栈段,只程序加载到内存后的用于push,pop的那部分内存,不是指数据段。
关于你说的段没法来保证代码的执行与否,那段的权限的设置还有什么意义么?望解答~
2012-5-12 18:29
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
你没有理解我说的话,对于x86来说,只有代码段和数据段,“栈”的本质还是数据段,如果有看下寄存器,应该可以发现SS和DS是相同的,(内核态下可能会有所不同)。

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

关于x86保护模式的保护法则,参考
保护模式下的保护
INTEL-X86保护模式下的内存管理

也可以先找其它保护模式的书先看下,大概了解下。http://www.intel.com/Assets/ja_JP/PDF/manual/253668.pdf

不知道是否回答了你的问题,感觉有些跑题。
2012-5-12 22:59
0
雪    币: 96
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感谢,终于理解了~~
2012-5-13 00:11
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
关于x86基础知识,有个不错的视频教程:x86 basic
2012-5-13 11:46
0
游客
登录 | 注册 方可回帖
返回
//