一、C栈帧结构
- 函数调用内存中的三个区域,代码区、静态数据区、动态数据区(压栈和清栈就是在这个区域完成的)。
- CPU中有三个寄存器,分别是eip、ebp和esp。eip永远指向代码区中将要执行的下一条指令,执行方式包括顺序执行和跳转;ebp和esp用于管理栈空间,ebp指向栈底,esp指向栈顶,代码区中的函数调用、返回和执行都伴随着不断的压栈和清栈,在调用函数时,ebp会指向Previous Frame Pointer以在执行函数之后返回到原来的地址。栈中数据存储和释放的原则:后进先出。
二、实验原理
- 1、缓冲区溢出是因为在程序执行时数据的长度超出了预先分配的空间大小,导致覆盖了其他数据的分配区域,从而执行非授权指令,获取信息,取得系统特权进而进行各种非法操作导致程序运行失败、系统宕机、重新启动等后果。普通的程序员由于失误导致的缓冲区溢出可能只会导致程序无法运行而不会影响系统,但是如果黑客使用构造好的数据来进行缓冲区溢出攻击则可能获得超级管理员权限,非常危险。
- 2、数据执行保护机制的开启与关闭
- ASLR 技术是一种针对缓冲区溢出的安全保护技术。
- ASLR功能等级:Linux系统中ASLR 技术分三个等级。如下:
- 0:没有随机化。即关闭 ASLR。
- 1:保留的随机化。共享库、栈、mmap() 以及 VDSO 将被随机化。
- 2:完全的随机化。在 1 的基础上,通过 brk() 分配的内存空间也将被随机化。
- ASLR 功能关闭
- ASLR 的等级可以通过一个内核参数 randomize_va_space 来进行控制。
- 系统默认这个功能是开启的。有时候调试代码时,需要更改 ASLR 功能,可通过命令设置。
- 如果想关闭该功能,则可以输入如下命令即可关闭,注意需要 root 权限,命令如下:
echo 0 > /proc/sys/kernel/randomize_va_space
ASLR功能开启
echo 1 > /proc/sys/kernel/randomize_va_space
可通过命令查看当前系统的 ASLR 等级,操作如下:
cat /proc/sys/kernel/randomize_va_space
三、实验过程
1、首先我们要构造一个拥有缓冲区溢出漏洞的程序,代码如下:
| #include <stdio.h> #include <string.h> char buffer[] = "01234567890123456789========ABCD"; void foo1(){ printf("Run foo1() ,you are attacked !\n"); } void |

文章介绍了C语言中栈帧结构,阐述了缓冲区溢出的原理及其可能导致的安全问题。通过实验展示了在开启和关闭数据执行保护(ASLR)情况下,缓冲区溢出的影响。同时,解释了如何构造shellcode以执行恶意代码,展示了攻击成功的例子。

1万+

被折叠的 条评论
为什么被折叠?



