传统的32位模式下的linux内存布局,而对64位大概布局是一样的,只是分配的开始地址不同而已。
我们的主要目的是研究栈的分配,在图上我们可以看到kernel space 到stack中有一段random stack offset,而这块区间的存在是让攻击者更难以猜到被攻击栈的起始地址,从而增加栈溢出攻击的难度,但在linux上是可以配置这段random stack offset是否存在。
/proc/sys/kernel /randomize_va_sapce
通过设置参数为0 可以关闭random stack offset.
echo 0 >/proc/sys/kernel/randomize_va_space
当设置参数为0的时候,这样每次起来的相同的程序的栈空间地址分配是一样的,我们可以通过/proc/[processid]/maps 来观察进程的内存分布。
运行下面的代码多次在randomize_va_space为0或者1的情况下
buff.c
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
char buffer[500];
printf("buf's 0x%8x\n",&buffer);
return 0;
}
gcc -o buff buff.c
你会发现在0的时候,多次的结果是一样的,而在1的时候多次结果是不相同的,下面系列中,我们会针对这2种不同的情况下的采用不同的策略。