网络安全缓冲区溢出实验

实验要求

C 程序 homework08.c 的主函数如下:

int main(int argc, char * argv[]) {
    
	init_buf(Lbuffer, LEN);
	switch(argc) 
	{
   
    	case 1: f00(); break;
        case 2: f01(); break;
        case 3: f02(); break; 
        default: f00(); break; 
    } 
    puts("Done.\nThe program exited normally.");
    return 0; 
}

在 32 位的 ubuntu16.04 系统中用 gcc - fno-stack-protector 编译该程序,得到的可执行程序见附件,通过 gdb 调试,对 f00()、f01()和 f02()进行分析:

  1. 函数 f00()、f01()和 f02()是否导致段错误。

  2. 如果函数 f00()、f01()和 f02()导致段错误,计算出被攻击的缓冲区首地址与函数的返回地址所在的栈地址的距离(即偏移 OFFSET), 给出溢出后函数的返回地址(用16 进制数表示)。

实验步骤

  1. 关闭地址随机化机制,执行程序。

输入命令 sudo sysctl -w kernel.randomize_va_space=0 以关闭地址随机化,然后运行编译好的可执行程序 ./homework08,得到 Segmentation fault段错误。

在这里插入图片描述

  1. 为了找出段错误的原因,使用 gdb ./homework08进入 gdb 调试模式,在该模式下使用 r 命令默认运行 f00() 函数,可见函数 f00()发生段错误,为了找出错误原因,继续使用 gdb 调试程序。

    反汇编 main:

在这里插入图片描述
在这里插入图片描述

函数 f00()

反汇编 f00:

在这里插入图片描述

在函数 f00 的入口、对 strcpy 的调用、出口位置设置断点,运行程序并在断点处观察寄存器的值,

在这里插入图片描述

在这里插入图片描述

  • 第一个断点处,函数入口处的堆栈指针 esp 指向的栈(地址为 0xbfffef3c)保存了函数 f00() 返回到调用函数(main)的地址(0x080485a8),即“函数的返回地址” 。

    记录堆栈指针 e s p esp esp 的值,在此以 A A A 标记: A A A = $esp = 0xbfffef3c

  • 第二个断点处,查看执行汇编代码 strcpy@plt 前堆栈的内容。Lbuffer 的地址 0x0804a060 保存在地址为 0xbfffeea4 的栈中, buff 的首地址 0xbfffeeb5 保存在地址为 0xbfffeea0 的栈中。

    C 语言默认将参数逆序推入堆栈,所以 C 函数 strcpy(des, src) 的 src(main() 中变量 Lbuffer 的地址)先进栈(高地址),des ( f00()中 buff 的首地址 )后进栈(低地址)。

    B B B = buff 的首地址,则 buff 的首地址与返回地址所在栈的距离 = A A A - B B B = 0xbfffef3c - 0xbfffeeb5 = 0x87 = 135

    • 因此,如果 Lbuffer 的内容超过 135 字节,则将发生缓冲区溢出,并且返回地址被改写。
    • Lbuffer 的最后的 4 个字节为 FGHI,因此, 执行 strcpy 之后,返回地址由原来的 0x80484d1 变为 FGHI0x49484746),即返回地址被改写。
  • 第三个断点处,执行的指令为 ret。执行 ret 后程序指针 e i p eip eip 的值为 0x49484746,即程序跳转到 0x49484746 去执行,这是不可访问的内存地址,因此发生段错误。

    • 执行 ret 时把堆栈的内容(4个字节)弹出到指令寄存器 e i p eip eip e s p esp esp 的值增加 4,然后跳转到 e i p eip eip 所保存的地址去继续执行: ret 指令让 e i p eip eip 等于 e s p esp esp 指向的内容,并且 e s p esp esp 等于 e s p + 4 esp+4 esp+4

    • 可见,执行ret之前的堆栈的内容为 FGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW...,前 4 字节为 0x49484746。可以推断执行 ret 后将跳到地址 0x49484746 去执行。

    • eip = 0x49484746,正好是”FGHI”倒过来,这是由于 IA32 默认字节序为 little_endian(低字节存放在低地址)。

因此,f00 导致段错误,偏移 OFFSET = 0x87 = 135, 溢出后函数的返回地址 = 0x49484746

函数 f01()

反汇编 f01,并打断点:

在这里插入图片描述

同上述函数 f00() 步骤,可得以下步骤:

在这里插入图片描述

  • 记录堆栈指针 e s p esp esp 的值,以 A A A 标记: A A A = $esp = 0xbfffef2c

  • B B B = buff 的首地址 = 0xbfffee2a,则 buff 的首地址与返回地址所在栈的距离 = A A A - B B B = 0xbfffef2c - 0xbfffee2a = 0x102 = 258

  • 执行 ret 后程序指针 e i p eip eip 的值为 0x42415a59,即程序跳转到 0x42415a59 去执行,这是不可访问的内存地址,因此发生段错误。

因此,f01 导致段错误,偏移 OFFSET = 0x102 = 258, 溢出后函数的返回地址 = 0x42415a59

函数 f02()

反汇编 f02,并打断点:

在这里插入图片描述

同上述函数 f00() 步骤,可得以下步骤:

在这里插入图片描述

  • 记录堆栈指针 e s p esp esp 的值,以 A A A 标记: A A A = $esp = 0xbfffef2c

  • B B B = buff 的首地址 = 0xbfffeaa5,则 buff 的首地址与返回地址所在栈的距离 = A A A - B B B = 0xbfffef2c - 0xbfffeaa5 = 0x487 = 1159

  • 执行 ret 后程序指针 e i p eip eip 的值为 0x080485b6,即程序跳转到 0x080485b6 去执行,这是可访问的内存地址,并且正好是 main 中调用 f02() 后的下一条指令的地址,因此未发生段错误,程序执行完正常退出。

因此,f02 未导致段错误

相关推荐

  1. 汇编实现缓冲区溢出1

    2023-12-06 23:36:03       11 阅读
  2. 知识笔记(六十九)———缓冲区溢出攻击

    2023-12-06 23:36:03       41 阅读
  3. Nginx实现缓冲区

    2023-12-06 23:36:03       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-06 23:36:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-06 23:36:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-06 23:36:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-06 23:36:03       20 阅读

热门阅读

  1. 网络数据通信—ProtoBuf实现序列化和反序列化

    2023-12-06 23:36:03       38 阅读
  2. git小白初学习

    2023-12-06 23:36:03       29 阅读
  3. 让 OpenAI GPT4 出 10 道题测试其他开源大语言模型

    2023-12-06 23:36:03       23 阅读
  4. 什么是DDI?DDI的原理和作用是什么?一文看懂

    2023-12-06 23:36:03       35 阅读
  5. USTC Fall2023 高级人工智能期末考试回忆版

    2023-12-06 23:36:03       39 阅读
  6. 力扣labuladong一刷day29天二叉树

    2023-12-06 23:36:03       40 阅读
  7. 还记得当初自己为什么选择计算机?

    2023-12-06 23:36:03       32 阅读
  8. Spring第四课,MVC终章,应用分层的好处,总结

    2023-12-06 23:36:03       32 阅读
  9. 【分布式学习】之架构、系统、集群部署

    2023-12-06 23:36:03       39 阅读
  10. Prompt Toolkit探索:打造交互式CLI应用

    2023-12-06 23:36:03       37 阅读