首页
社区
课程
招聘
[旧帖] [讨论]数据段可执行不可执行的缘由? 0.00雪花
发表于: 2011-3-20 20:22 7606

[旧帖] [讨论]数据段可执行不可执行的缘由? 0.00雪花

2011-3-20 20:22
7606
数据串,初始时在磁盘上,然后被复制到主存上,最后从主存上复制到
显示器中... 现在我的真的有点儿理解数据段是不可执行的

按理说数据段中存放的应该都是一些字符常量之类的的,但是字符常量与代码段中的代码
并没有啥区别,最终都是二进制的...

那么我就郁闷了
,这个数据段到底是不可执行的,还是说没有被加载所以导致了没有被执行..

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 579
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你用LordPE看一下段的属性就知道了。数据段不可执行是右段属性决定的。
2011-3-20 20:26
0
雪    币: 7
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
那么他和CPU加不加载一点儿关系都没有的?
2011-3-20 20:30
0
雪    币: 723
活跃值: (81)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
windows xp sp2 开始支持 DEP(Data Executive Protection) 技术,利用 page entry 的 NX(No Execute)标志位设置不可执行页
2011-3-20 20:54
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
没错!!!
2011-4-8 10:37
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
4楼说的那个技术只针对64位的计算机和OS,32位上并没有。
数据段是否可执行,本质上在计算机中,一切数据皆可执行。
数据段之所以被拷贝、复制和显示,原因是其他可执行代码对它的操作,并不是它本身作为指令来执行。
数据段要执行,必须被PC指向,被CPU作为指令译码后执行。
数据段可以被执行。
2011-4-11 09:41
0
雪    币: 723
活跃值: (81)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
难道你用的 Xp sp2 是64 位的 OS? 虽然说 xp 也有 64位版本的,绝大部分用的还是 32 位版本。
NX 技术不只是 64 位机上才有,在 32 位机上也实现了,现在的 CPU 只要支持 PAE (physical address  extension) 就可以支持 NX 技术。
有一种技术叫做“自我复制”-既是指令又是数据
SO, 数据段可以选择不被执行。
2011-4-11 10:22
0
雪    币: 578
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
数据段可以被执行
数据段有没有被执行,应该还是看你的程序有没有让它执行,也就是说,有没有把CS:IP指向数据段中的数据
CPU是不认识啥是数据啥是代码的,就靠CS:IP和DS段帮它区分,然后经过不同的总线送入CPU
2011-4-11 10:43
0
雪    币: 192
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个就要看CPU是否在保护模式还是实模式了

在实模式下,就像以上很多人说的那样,CS:IP指向的内存地址会被直接送入译码器并且执行

但是在保护模式下因为gdt的加入,段基址实际上是描述符在gdt中的偏移(后3位为权限位),实际内存地址需要经过查gdt表来进行转换,这其中就涉及代码权限的问题了,另外还有内存分页机制也可能会影响到内存段是否可以执行
2011-4-11 18:12
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
存放数据的好像
2011-4-11 22:28
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
保护模式应该不能执行,段描述符决定了。
实模式可以。
2012-2-23 17:56
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
32位机器上是支持DEP的。
Intel从奔腾Pro开始支持PAE,其中用于DEP功能的那一位叫做EDB,Execute Disable Bit。
AMD从Athlon开始支持PAE,相应的禁止执行位叫做NX,no execute

楼主要理解这个问题首先要理解X86 处理器家族中段的概念和内存分页的概念。

从286开始,X86家族支持了保护模式,
这个模式下能给内存分段,凡是要利用一段内存,
不管是代码执行还是作为操作数地址,都是基于某个段来寻址的,
段由描述符来描述,描述符指出了段的基地址和大小,以及它是否可读是否可写,是否可执行。
(其实从8086开始,内存地址就靠段来寻找了,只不过8086的段无法限制地址的读写权限)

程序员先把段描述符表准备好,然后给4个段寄存器,CS,DS,ES,SS装入恰当的值来表示这个段寄存器使用的是哪个段描述符所指示的段。

因此,每个地址都有可读可写,以及是否可执行的信息。
如果不指明特定的段,那么普通数据用的是DS段,sp和bp寄存器使用SS段,代码执行使用CS段

386开始,X86家族支持内存分页。
本身段+偏移指出的是一个线性地址,它直接用于286的内存寻址。
386中新增了内存分页功能,如果打开了内存分页,操作系统还须构造页表来指明每个线性地址如何映射到物理地址的规则。
而这些规则中可以以4096字节为单位指明内存地址是否有效,是否可读是否可写。

X86处理器上运行的Windows 避开了X86家族中的分段的功能,让SS和DS段的基地址是0,并且可读可写,而使用分页功能来标明内存是否可读是否可写。
SS代码段默认是不可写的,也让它的基地址是0.
这里有个坏处就是,分页功能不能指明4096字节的一页内存是否可执行。
因此实际上一个页面如果是可读的那么就可以执行。
(386还增加了gs,fs两个段寄存器,想必关于fs寄存器的功能已经不必多说了)

PAE功能改变了这一面貌,增强的PAE功能有EDB\NX功能,使保护模式下可以控制一页内存是否可执行,因此Windows中的非代码段终于可以真正不可执行了。

另外插一句,平时所谓的64位模式,AMD称为x86-64指令集中的长模式,Intel对应的称为EM64T技术下的IA32e模式,从一开始就支持EDB\NX功能,也就是说X86家族上的64位Windows总是能够支持DEP功能的。

另外再谈一下Windows可执行文件中的section,有时翻译为段有时候翻译为节,
这些节总是利用Windows中的内存映射功能映射到一个或多个内存页面,因此在DEP功能之下可以禁止这些地址的指令的执行。
不过即使在未使用DEP功能的系统上,Windows仍然会记录不可执行的内存页,只不过操作系统也无力阻止其中的数据作为指令执行。
2012-2-24 21:43
0
游客
登录 | 注册 方可回帖
返回
//