当前位置: 技术问答>linux和unix
书上说进程堆栈段可执行,请问这个可执行是什么意思?
来源: 互联网 发布时间:2016-04-29
本文导语: 代码段里面是可执行代码,段属性可读可执行不可写 数据段里是堆/全局变量和静态变量.....,段属性是可读可写不可执行 堆栈段里面是返回地址/局部变量......段属性是可读可写可执行 这个代码段可执行我能够理解,...
代码段里面是可执行代码,段属性可读可执行不可写
数据段里是堆/全局变量和静态变量.....,段属性是可读可写不可执行
堆栈段里面是返回地址/局部变量......段属性是可读可写可执行
这个代码段可执行我能够理解,因为里面装的就是像一条一条的汇编命令,好像是有个什么指针,指针指到那条命令就执行该命令。
请问这个堆栈段说的“可执行”是什么意思?它不是专门放数据的吗,它里面怎么放命令,我程序编译后的代码可执行命令不是都应该放到代码段吗,怎么能跑到堆栈段里。 请大家指点一下,小弟先在此谢过了。
数据段里是堆/全局变量和静态变量.....,段属性是可读可写不可执行
堆栈段里面是返回地址/局部变量......段属性是可读可写可执行
这个代码段可执行我能够理解,因为里面装的就是像一条一条的汇编命令,好像是有个什么指针,指针指到那条命令就执行该命令。
请问这个堆栈段说的“可执行”是什么意思?它不是专门放数据的吗,它里面怎么放命令,我程序编译后的代码可执行命令不是都应该放到代码段吗,怎么能跑到堆栈段里。 请大家指点一下,小弟先在此谢过了。
|
不要常规地想这件事,至于代码段,数据段,堆栈段的概念我就不说了,考虑缓冲区溢出攻击,其中很有效的一种方式就是栈溢出(还有堆溢出...),当你调用一个函数的时候栈如下:
主调函数的栈帧 -->
esp-->数据(地址为XXXX)
......
-->局部变量(local)
ebp-->老的栈指针
-->被调函数的返回地址
-->函数参数
主调函数的栈帧 -->
......
如果局部变量local向下溢出,那么就会覆盖被调函数的返回地址,如果攻击者将其攻击代码(当然是要用来执行的)放到XXXX处,XXXX也在堆栈中,而且恰好把被调函数的返回地址覆盖成地址XXXX(需要一定技术),那么当函数返回的时候,执行流就会自觉地进入XXXX开始执行,再强调一遍XXXX在堆栈,但是如果堆栈可执行,那么攻击者的目的就达到了,若堆栈不可执行,那么程序立马报错退出,攻击者就要考虑别的手段了。至于怎么设置可执行,那就要看硬件和操作系统的实现了,可在段表设置,也可以在页表设置,对于linux和windows这种平坦模式的段而言,设置堆栈对应的页表项的可执行位为1或为0代表堆栈可执行或者不可执行
主调函数的栈帧 -->
esp-->数据(地址为XXXX)
......
-->局部变量(local)
ebp-->老的栈指针
-->被调函数的返回地址
-->函数参数
主调函数的栈帧 -->
......
如果局部变量local向下溢出,那么就会覆盖被调函数的返回地址,如果攻击者将其攻击代码(当然是要用来执行的)放到XXXX处,XXXX也在堆栈中,而且恰好把被调函数的返回地址覆盖成地址XXXX(需要一定技术),那么当函数返回的时候,执行流就会自觉地进入XXXX开始执行,再强调一遍XXXX在堆栈,但是如果堆栈可执行,那么攻击者的目的就达到了,若堆栈不可执行,那么程序立马报错退出,攻击者就要考虑别的手段了。至于怎么设置可执行,那就要看硬件和操作系统的实现了,可在段表设置,也可以在页表设置,对于linux和windows这种平坦模式的段而言,设置堆栈对应的页表项的可执行位为1或为0代表堆栈可执行或者不可执行
|
堆栈段也是可以执行的,你说的只是一般情况而已,其实是可以设置页属性在堆栈段执行代码的。
LINUX内核中关于信号部分就有在堆栈中执行的实现。
LINUX内核中关于信号部分就有在堆栈中执行的实现。