缓存区溢出攻击实验(1)

本实验预计分 3 个小实验来做,本文是第一个实验。

  1. 缓存区溢出攻击实验(1)
  2. 缓存区溢出攻击实验(2)
  3. 缓存区溢出攻击实验(3)

背景介绍

先看下百度百科里的 缓冲区溢出攻击 :

缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符。但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区,又被称为“堆栈”,在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。

大概了解一下缓冲区溢出的概念之后,需要知道一些关于堆栈的基础知识。

由于这些是计算机学科的基础,我在网上稍微搜了一下也没有找到讲得比较好的文章=。=考虑到对本实验有兴趣的基本都会是计算机相关学科的学习者,因此此处就不再补充关于堆栈的一些基础知识。

实验环境

  • 系统

    Windows 10 家庭中文版 (64 bit)

  • IDE

    Code::Blocks

  • 编译器

    MinGW

下面先放源代码再来看实验内容。

源代码

#include <stdio.h>
#include<string.h>void overflow(const char* input) {char buf[8];printf("Virtual address of 'buf' = Ox%p\n", buf);strcpy(buf,input);
}void fun() {printf("Function 'fun' has been called without an explicitly invocation.\n");printf("Buffer Overflow attack succeeded!\n");
}int main(int argc, char* argv[]) {printf("Virtual address of 'overflow' = Ox%p\n",overflow);printf("Virtual address of 'fun' = Ox%p\n",fun);// Section 1 : normalchar input[]="AAAAAAAA";// Section 2 : attcak//char input[]="AAAAAAAAAAAAAAAAAAAA\xB9\x13\x40\x00";overflow(input);return 0;
}

实验目的

在 main 函数中调用 overflow 函数,在 overflow 函数的实现中有一段向数组写入数据的代码,在这段代码中填充过长的数据,令其缓冲区溢出,让我们的数据(实质是 fun 函数的入口地址)覆盖掉 overflow 执行完成之后的返回地址。这样做的结果就是,当 overflow 函数执行完之后本来应该返回 main 函数,结果返回到了本来没有被调用的 fun 函数的入口,执行了 fun 函数,缓冲区溢出攻击成功。

实验步骤

  1. 安装好 Code::Blocks (以下简称 CB)与 MinGW,配置环境变量,打开 CB,设置 Compiler 为 GNU GCC Compiler,设置 Debugger 的 Executable path 为 ...\MinGW\bin\gdb.exe

  2. 新建 project,输入源代码,build,run,我们可以得到 fun 函数的入口地址,本例中为 0x004013B9,运行结果如下:

  3. 在 main 函数中的 overflow(input); 与 overflow 函数中的 strcpy(buf,input); 处打上断点,重新运行程序。

  4. 在 main 函数中的 overflow(input); 处暂停,打开菜单栏里的 Debug->Debugging windows->Disassembly,可以看到 main 函数执行时的汇编语言与逻辑地址,如下图所示:

  5. 我们可以找到类似 call 0x40138c <overflow> 的语句,紧接着的下一句便是 overflow 函数执行结束之后返回 main 函数继续运行的语句,因此,在 overflow 执行时的堆栈中,函数执行完毕之后的返回地址应该为此处的地址。本例的地址为 0x401434

  6. 继续运行,在 overflow 函数中的 strcpy(buf,input); 处暂停,打开菜单栏里的 Debug->Debugging windows->Memory dump,在 Address 中输入 buf (overflow 中的缓冲区)进行搜索,得到此时栈空间中 buf 的地址与数据,如下图所示:

  7. 观察该图,buf 存储的地址为 0x61fec8,而我们在其中寻找到在前几步得到的 overflow 执行完毕之后的返回地址 0x401434 如图中所示。距离 buf 的起始头一共 20 个字节。因此我们可以考虑向 buf 所在的地址写入 24 个字节,覆盖栈空间原有的数据,从而使 overflow 函数执行完毕之后返回我们写入的4个字节的地址,而不是返回 main 函数继续执行。

  8. 将源代码中的语句

    char input[]="AAAAAAAA";

    修改为

    char input[]="AAAAAAAAAAAAAAAAAAAA\xB9\x13\x40\x00";

    其中修改后的字符串一共 24 个字节,最后 4 个字节是 fun 函数的入口地址。

  9. 执行程序,运行结果如下所示:

    攻击成功!

实验中遇到的问题

Code::Blocks build 失败,报错信息 Execution of 'mingw32-g++.exe -o E:\C\hii\main.exe E:\C\hii\main.o' in 'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\CodeBlocks' failed.

可能是没有安装g++却使用了g++进行编译?打开 Settings->Compiler->Global compiler settings->Toolchain executables->Program Files,将 C compilerLinker for dynamic libs 修改为 gcc。

Code::Blocks 有时候会出现 build 按钮无法点击的状况

其实只是因为虽然 run 的程序关掉了,然而后台的进程依然在跑… 打开任务管理器强行将其 kill 掉。然而实测可能出现强行 kill 不了的情况,那就只能关闭 CB 重开= =。

思考

Process returned 出错

在程序的结尾必定会出错,原因一下子就可以想到。因为在栈空间中,原本 main 函数调用 overflow 函数,在函数执行完毕之后原本将会返回 main 函数中 overflow 函数的下一行,但是在我们实施了缓冲区溢出攻击之后,overflow 函数执行完毕之后程序将跳转到 fun 函数的入口地址。执行完 fun 函数之后,栈空间中下面的地址已乱,因此必然出错。

缓存区溢出攻击实验(1)相关推荐

  1. CSAPP lab3 bufbomb-缓冲区溢出攻击实验(下)bang boom kaboom

    CSAPP lab3 bufbomb-缓冲区溢出攻击实验(上)smoke fizz CSAPP lab3 bufbomb-缓冲区溢出攻击实验(下)bang boom kaboom 栈结构镇楼 这里先给 ...

  2. 缓存区溢出漏洞工具Doona

    缓存区溢出漏洞工具Doona Doona是缓存区溢出漏洞工具BED的分支.它在BED的基础上,增加了更多插件,如nttp.proxy.rtsp.tftp等.同时,它对各个插件扩充了攻击载荷,这里也称为 ...

  3. 缓存区溢出检测工具BED

    缓存区溢出检测工具BED 缓存区溢出(Buffer Overflow)是一类常见的漏洞,广泛存在于各种操作系统和软件中.利用缓存区溢出漏洞进行攻击,会导致程序运行失败.系统崩溃.渗透测试人员利用这类漏 ...

  4. 实验8 缓冲区溢出攻击实验

    实验8 缓冲区溢出攻击实验 缓冲区溢出是目前最常见的一种安全问题,操作系统以及应用程序大都存在缓冲区溢出漏洞.缓冲区是一段连续内存空间,具有固定的长度.缓冲区溢出是由编程错误引起的,当程序向缓冲区内写 ...

  5. 计算机系统基础学习笔记(7)-缓冲区溢出攻击实验

    缓冲区溢出攻击实验 实验介绍 实验任务 实验数据 目标程序 bufbomb 说明 bufbomb 程序接受下列命令行参数 目标程序bufbomb中函数之间的调用关系 缓冲区溢出理解 目标程序调用的ge ...

  6. C++ VS2019 缓存区溢出和读取数据无效的警告

    人生不像做饭,不能等万事俱备了才下锅 今天在使用new创建动态数组时出现"缓存区溢出"和"读取数据无效"的警告,警告如下: 代码如下: void test(in ...

  7. 缓冲区溢出攻击实验(C语言 | 汇编语言 | 输出deadbeef)

    缓冲区溢出攻击实验(输出deadbeef) C语言题目源码 尝试 运行程序 观察 分析 栈内部情况 决定使用栈溢出 实施 使用vs2019打开反汇编 使用反汇编 构造payload 得到结果 C语言题 ...

  8. SEED-缓冲区溢出攻击

    实验环境:SEED-Ubuntu20.04虚拟机 文章目录 A. 缓冲区溢出攻击实验准备 a) 缓冲区溢出原理 b) 分析生成badfile文件的exploit.py程序 c) 编译目标服务器上具有缓 ...

  9. 计算机系统(2) 实验四 缓冲区溢出攻击实验

    计算机系统(2) 实验四 缓冲区溢出攻击实验 一. 实验目标: 二.实验环境: 三.实验内容 四.实验步骤和结果 (一)返回到smoke (二)返回到fizz()并准备相应参数 (三)返回到bang( ...

最新文章

  1. simplexml php,php的simplexml
  2. 【Linux】24.gdb调试和coredump
  3. 用杰克逊流式传输大型JSON文件– RxJava常见问题解答
  4. 微型计算机各部件之间通过总线传递各种信息,2015年9月计算机一级考试基础及MSOffice应用选择真题...
  5. vue-cli起服务chrome不能打断点——每周汇总(第一周)
  6. python3 运行you get_一个基于Python3的神奇插件——you-get
  7. 【识记】Nginx 访问控制
  8. iOS--React Native浏览器插件
  9. ArcEngine在个人地理数据库下创建要素类
  10. 下载图片的java工具类_ftputil 下载图片工具类
  11. 《OpenGL编程指南(原书第9版)》——3.4 OpenGL的绘制命令
  12. 数字图像处理实验九维纳滤波
  13. C6000 DSP技术深度探索(3)-中断向量表
  14. 网站嵌入虚拟试衣间方案问题
  15. python课程报告模板_《Python语言编程课程设计》课程设计报告模版
  16. 单片机定时器实现的数字时钟
  17. 计算机一级表格减法,怎么把表格的数字全部加减
  18. 网络开发框架 ——Kestrel
  19. 怎么对一张图片进行局部拉伸,变形,或放大?
  20. douboo php_【H5游戏源码】Long/Hu/Dou/微信游戏源码+全套开源完整源码[整站打包]

热门文章

  1. 期货平盘(期货大单压盘)
  2. STM32(四)嵌入式浅谈与学习方法
  3. rust各地辐射值_辐射率表
  4. (一)Dart基本语法
  5. 使用Java驱动ACR122U对IC卡进行读写,总结
  6. 06-添加用户关注、我的关注列表
  7. 云课堂如何培养下一代创新思辨的能力?
  8. 云桌面-ThinVirt3-EXP操作手册(四)云终端连接虚拟机
  9. 更改xrdp,默认的3389端口
  10. VFX Graph 魔法图书馆