linux缓冲区溢出尝试

#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程序

 

 

 

 

 

 

反汇编mainfoo

 

 

 

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

 

 

 

 

 

 

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

 

esp 的 值 , 在 此 以 A 标 记 :

 

    A=$esp=0xbffff10c

 

   继续执行到下一个断点

 

 

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

 

 

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

  B=buff的首地址=0xbffff0ec

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

第三个断点出现错误

 

 

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

 

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

 

 

 

 

 

 

 

 

 

posted @ 2020-06-02 19:45  big螺丝  阅读(243)  评论(0编辑  收藏  举报