能力值:
( LV4,RANK:55 )
|
-
-
2 楼
楼主看下dep相关东西吧,栈中数据不能执行需要cpu和操作系统的支持
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
谢谢evilor,看了dep的东东,第二个问题明白了,但是还是不清楚第一个问题~OD看到的栈段内存权限是不可执行的,可是本机测试溢出程序还是能成功,shellcode执行了,不知道是什么原因~
|
能力值:
( LV3,RANK:20 )
|
-
-
4 楼
我有点不明白具体细节,如果有权限写对方的栈,起码对方不会比你的权限高,那么让对方来执行和自己去执行有什么区别呢?隐藏的话远线程注入就够了吧?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
楼主,推荐你去看下PE结构方面的知识
你就知道是什么原因了
在这里三言两语也说不透彻
看完PE你就知道堆栈数据到底放哪里了
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
请说说吧。。PE我之前就看过了,到没发现能解决我第一个问题的解释。。这边是堆栈的数据,PE映射到内存里面跟堆栈不是一个地方的吧。。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
不是很清楚你的意思。。
|
能力值:
( LV4,RANK:40 )
|
-
-
8 楼
一个内存段 能不能执行 看页面的属性 可读可写可执行,堆栈也只是一小块内存. 溢出 只是改变了EIP的指向。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
可能我没描述清楚吧。。我的问题就是用OD看是不可执行的,但是实际却能够执行。。这个矛盾的原因。。
|
能力值:
( 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缺省不会对所有的进程做这样的操作。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
第二个问题的答案我查阅了应该是兼容性和动态代码生成,以及其他部分优化。
我这边说的段确实是栈段,只程序加载到内存后的用于push,pop的那部分内存,不是指数据段。
关于你说的段没法来保证代码的执行与否,那段的权限的设置还有什么意义么?望解答~
|
能力值:
( 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
不知道是否回答了你的问题,感觉有些跑题。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
感谢,终于理解了~~
|
能力值:
( LV4,RANK:50 )
|
-
-
14 楼
|
|
|