- 主题:如何避免栈区溢出?
rt
或者栈区溢出怎么处理?
面试被问到了
--
FROM 120.244.238.*
可以在编译器中增加一些判断逻辑,比如在函数调用之后,在声明其他变量之前,隐式地声明一个barrier变量,并用一个magic number初始化它,然后在函数返回前,检查下该变量的值是否发生了变化,如果发生了变化,则意味着这段代码尝试溢出stack。。。
【 在 feed 的大作中提到: 】
: rt
: 或者栈区溢出怎么处理?
: 面试被问到了
--
FROM 113.233.219.*
没听明白啊
能详细说说吗? 首先你是用什么语言?
【 在 siegfried415 的大作中提到: 】
: 可以在编译器中增加一些判断逻辑,比如在函数调用之后,在声明其他变量之前,隐式地声明一个barrier变量,并用一个magic number初始化它,然后在函数返回前,检查下该变量的值是否发生了变化,如果发生了变化,则意味着这段代码尝试溢出stack。。。
:
--
FROM 120.244.238.*
这个故事太长了,我实在没时间仔细展开,估计你得找本汇编语言的书看看了。。。
【 在 feed 的大作中提到: 】
: 没听明白啊
: 能详细说说吗? 首先你是用什么语言?
:
--
FROM 113.233.219.*
估计只是想考察你strncpy这一类函数?
【 在 feed (鳄鱼) 的大作中提到: 】
: rt
: 或者栈区溢出怎么处理?
: 面试被问到了
: --
--
FROM 114.87.129.*
coding时注意栈上拷贝操作等,注意长度?
【 在 feed 的大作中提到: 】
: rt
: 或者栈区溢出怎么处理?
: 面试被问到了
--
FROM 180.124.210.*
先明确两个概念,是栈顶溢出还是栈上数组溢出。
栈顶溢出一般是递归调用层数过多,栈地址超出了栈顶。如果在libc实现中,分配栈地址的时候在前面用mmap+mprotect分配了一个stack guard page,就会触发SIGBUS;
但更多的时候是栈上数组的溢出,如果是写溢出会写入到其它变量,甚至栈上保存的寄存器压栈区、上一层函数的变量等,很大几率导致崩溃,也可能会触发任意代码执行。
比如接受用户输入参数,拷贝到栈上数组时没有检查长度,用户就可以构造payload进行攻击。
这种防范没有实际上的好办法,可以通过在当前栈首增加stack check位的方式,如果被改写就跳转到stack_chk_fail,但是并不能确保不出问题
--
FROM 123.58.117.*