linux缓冲区溢出尝试

2023-03-08,,

#include <stdio.h>
#include <string.h>
char Lbuffer[] = "01234567890123456789========ABCD";
void foo()
{
  char buff[16];
  strcpy (buff, Lbuffer);
}
int main(int argc, char * argv[])
{
   foo(); return 0;
}

32位Linux系统的C函数如下:

void foo01()

{

char buff[16]; char Lbuffer[] = "01234567890123456789========ABCD";

strcpy (buff, Lbuffer);

}

char Lbuffer[] = "01234567890123456789========ABCD";

void foo02()

{

char buff[16]; strcpy (buff, Lbuffer);

}

用foo01()和foo02()替换buffer_overflow.c中的foo(),通过gdb调试, 分析foo01()和foo02()是否存在缓冲区溢出漏洞。

首先关掉关闭栈底随机化

创建测试实例

编译并运行该C程序

反汇编main和foo

在关键位置设置断点并运行程序

函数入口处的堆栈指针esp 指向的栈(地址为 0xbffff10c)保存了函数foo() 返回到调用函数 (main)的地址(0x080484af),即“函数的返回地址”。

记 录 堆 栈 指 针 esp 的 值 , 在 此 以 A 标 记 :

A=$esp=0xbffff10c

继续执行到下一个断点

由于C 语言默认将参数逆序推入堆栈,因此,src(全局变量Lbuffer的地址)先进栈(高地址),des(foo()中buff的首地址)后进栈(低地址)。

可见,Lbuffer的地址0x804a040保存在地址为0xbffff0d4的栈中,buff的首地址0xbffff0ec保存在地址0xbffff0d0的栈中。

令B=buff的首地址=0xbffff0ec

则buff的首地址与返回地址所在栈的距离 =A-B=0xbffff10c -  0xbffff0ec=0x20=32。

第三个断点出现错误

预计A-B的距离为28位,实际结果32位,且在第三个断点就出现错误,实验无法继续下去,原因未知。

将foo1编译并运行,没有出现问题。

linux缓冲区溢出尝试的相关教程结束。

《linux缓冲区溢出尝试.doc》

下载本文的Word格式文档,以方便收藏与打印。