CSAPP Lab3- bufbomb

news2024/12/26 23:40:23

实验目标

(1)掌握函数调用时的栈帧结构

(2)利用输入缓冲区的溢出漏洞,将攻击代码嵌入当前程序的栈帧中,使得程序执行我们所期望的过程

实验代码

(1)makecookie:生成cookie  例:./makecookie SA22225284 生成cookie

(2)Bufbomb:可执行程序-攻击对象

(3)Sendstring:  字符格式转换

bufbomb程序

Bufbomb中包含一个getbuf函数,该函数实现如下

int getbuf() 
{ 
  	char buf[12]; 
 	gets(buf); 
 	return 1; 
}

对buf没有越界检查(常见c编程错误),超过11个字符将溢出

溢出

溢出的字符将覆盖栈帧上的数据

  • 特别的,会覆盖程序调用的返回地址
  • 赋予我们控制程序流程的能力 

通过构造溢出字符串,程序将“返回”至我们想要的代码上

字符构造

计算机系统中,字符以ASCII码表示/存储,例如,输入’1’,存储为’0x31’ ,本实验也需要扩展的ASCII码(128~255)

为了构造所需要的地址或其他数据,我们需要逆反“字符->ASCII码”的过程

采用代码包给出的    sendstring工具。 使用方法:

./sendstring < exploit.txt > exploit-raw.txt

其中exploit.txt保存目标数据(即空格分隔的ASCII码),exploit-raw.txt为逆向出的字符串

字符串输入

前述方法构造出的字符串按如下方式输入:

./bufbomb -t SA22225284 < exploit-raw.txt

从标准输入设备输入,方式如下:

ALT+ASC码的十进制数(小键盘输入) 注意,最后一个数字按下后与ALT键同时放开。例,输入字符“1”为ALT+49

实验完成后提交exploit.txt文件


运行时栈

C语言过程调用机制的一个关键特性(大多数其他语言也是如此)在于使用了栈数据结构提供的后进先出的内存管理原则。在过程Р调用过程Q的例子中,可以看到当Q在执行时,P以及所有在向上追溯到P的调用链中的过程,都是暂时被挂起的。当Q运行时,它只需要为局部变量分配新的存储空间,或者设置到另一个过程的调用。另一方面,当Q返回时,任何它所分配的局部存储空间都可以被释放。因此,程序可以用栈来管理它的过程所需要的存储空间,栈和程序寄存器存放着传递控制和数据、分配内存所需要的信息。当Р调用Q时,控制和数据信息添加到栈尾。当P返回时,这些信息会释放掉。

x86-64的栈向低地址方向增长,而栈指针%rsp指向栈顶元素。可以用pushq和popq指令将数据存入栈中或是从栈中取出。将栈指针减小一个适当的量可以为没有指定初始值的数据在栈上分配空间。类似地,可以通过增加栈指针来释放空间。
当x86-64过程需要的存储空间超出寄存器能够存放的大小时,就会在栈上分配空间。这个部分称为过程的栈帧(stack fram)。

下图给出了运行时栈的通用结构,包括把它划分为栈帧。当前正在执行的过程的帧总是在栈顶。当过程Р调用过程Q时,会把返回地址压入栈中,指明当Q返回时,要从Р程序的哪个位置继续执行。我们把这个返回地址当做Р的栈帧的一部分,因为它存放的是与Р相关的状态。Q的代码会扩展当前栈的边界,分配它的栈帧所需的空间。在这个空间中,它可以保存寄存器的值,分配局部变量空间,为它调用的过程设置参数。大多数过程的栈帧都是定长的,在过程的开始就分配好了。但是有些过程需要变长的帧。通过寄存器,过程Р可以传递最多6个整数值(也就是指针和整数),但是如果需要更多的参数,P可以在调用Q之前在自己的栈帧里存储好这些参数。

为了提高空间和时间效率,x86-64过程只分配自己所需要的栈帧部分。例如,许多过程有6个或者更少的参数,那么所有的参数都可以通过寄存器传递。因此,下图画出的某些栈帧部分可以省略。实际上,许多函数甚至根本不需要栈帧。当所有的局部变量都可以保存在寄存器中,而且该函数不会调用任何其他函数(有时称之为叶子过程,此时把过程调用看做树结构)时,就可以这样处理。

 

Level 0: Candle

主体函数

 

getbuf函数在test中被调用,当getbuf返回时继续执行第八行

Bufbomb中一个正常情况下不会被执行的函数

void smoke() 
{ 
    entry_check(0); /* Make sure entered this function properly */ 
    printf("Smoke!: You called smoke()\n"); 
    validate(0); 
    exit(0); 
} 

我们的目标:在getbuf返回时跳到smoke函数执行

老师提供的实验思路:

  • 通过调试得到我们输入的字符串首地址,并打印出该字符串作验证x/s $ebp-0xc
  • 找到函数smoke的地址 p/x &smoke
  • 用smoke函数的地址覆盖getbuf的返回地址

构造一个攻击字符串作为bufbomb的输入,在getbuf()中造成缓冲区溢出,使得getbuf()返回时不是返回到test函数,而是转到smoke函数处执行。所以我们需要:

在bufbomb的反汇编源代码中找到smoke函数,记下它的起始地址

 

同样在bufbomb的反汇编源代码中找到getbuf()函数,观察它的栈帧结构

 

如以上图所示,我们可以看到getbuf()的栈帧是0x18+4个字节,而buf缓冲区的大小是0xc(12个字节)。

构造攻击字符串覆盖返回地址

攻击字符串的功能是用来覆盖getbuf函数内的数组buf(缓冲区),进而溢出并覆盖ebp和ebp上面的返回地址,所以攻击字符串的大小应该是0xc+4+4=20个字节。并且其最后4个字节应是smoke函数的地址,正好覆盖ebp上方的正常返回地址。这样再从getbuf返回时,取出的根据攻击字符串设置的地址,就可实现控制转移。

所以,这样的攻击字符串为:

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 8e 04 08

总共20个字节,并且前面16个字节可以为任意值,对程序的执行没有任何影响,只要最后四个字节正确地设置为smoke的起始地址<0x08048e20>即可,对应内存写入20 8e 04 08(小端格式)。

Level 1: Sparkler

另一函数

目标:“返回”到该函数并传送参数cookie

Cookie必须为自己学号生成,格式示例如下: SA22225284使用以下指令生成

./makecookie SA22225284

通过观察栈帧结构可以发现只需要在smoke攻击字串后面再继续覆盖调用栈帧的参数。我们知道在执行完ret指令后栈顶指针 %esp 会自动增加4以还原栈帧。

通过查找fizz()得知:

fizz()函数的起始地址为 <0x08048dc0> 。与smoke相同,ebp+4为栈帧返回地址。执行完ret指令后栈顶指针 %esp 会自动增加4以还原栈帧。在fizz汇编代码段,cmp指令是将存放cookie的变量与%ebp+0x8处的值相比,此时参数地址也就是旧的ebp+4+8。我们只需要将自己的cookie放置在该位置即可。

所以构造攻击文件fizz.txt如下:

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c0 8d 04 08 00 00 00 00 76 9f 6b 30

其中,<0x08048dc0>为fizz函数起始地址,<0x306b9f76>为自己的cookie,通过参数传递给fizz。

最后执行测试结果如下:


 由于下周有三门考试,所以剩下的两个选做实验就暂时不做了hh~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/508870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解读IEC有关“雷击防护”的新要求

背景介绍 TC64标委会在IEC 组织里负责低压电气装置安全规范的起草和编制&#xff0c;主要出版物有&#xff1a;IEC60364、IEC61140、IEC60479等。 在国内由TC205标委会负责参与TC64活动、等同转化的出版物&#xff0c;如&#xff1a;IEC60364等同转化为GB16895系列规范等。 …

2023零售店铺管理系统最新排名,这5款性价比高!

很多零售店铺的老板&#xff0c;每天都在被开单收银、记账对账、商品销售、销售数据等各种琐事困扰&#xff0c;使用传统的人工管理模式&#xff0c;耗费了大量的时间和成本&#xff0c;也没有达到理想的效果。 其实&#xff0c;零售店铺管理也可以很简单省事&#xff0c;借助零…

[Java基础练习-002]综合应用(基础进阶)

1、进阶练习一、学习网站&#xff08;主要考察选择结构、输入语句&#xff09; 请使用现有的java基础知识开发一个学习网站主要实现如下功能&#xff1a; &#xff08;1&#xff09;、显示第一层登录菜单&#xff0c;选择登录后再显示第二层主菜单&#xff0c;否则退出系统&a…

虹科分享|终端安全防护|您的遗留系统的安全性如何?

自2023年1月10日起&#xff0c;Windows 7、Windows 8、Windows 8.1及其衍生产品Windows Embedded以及Windows Server 2008 R2将不再收到微软提供的补丁程序。数以百万计的设备现在将成为“遗留”设备&#xff0c;并产生一系列新的遗留安全风险。 Windows 7支持结束&#xff0c…

哪种蓝牙耳机戴着耳朵不痛?佩戴舒适不挑耳朵的蓝牙耳机

蓝牙耳机早已成为了人们使用手机时的下意识选择&#xff0c;目前蓝牙耳机品牌也多、种类也多&#xff0c;不知道你会不会有选择困难症&#xff1f;综合大家关注的点&#xff0c;小编发现佩戴舒适度这方面是大家较为注意的&#xff0c;下面小编整理了一期佩戴舒适不挑耳的蓝牙耳…

递归算法求数组中的最值

一、关于递归算法和一般算法 递归算法和一般算法相比&#xff0c;递归算法的思维量会大很多&#xff0c;不仅很难理解&#xff0c;用起来还容易出错&#xff0c;所以大家平时用一般算法就足够了。就拿今天我们要实现的“求数组中的最值”来举例吧&#xff0c;用一般算法一个循…

用SD完美还原金庸小说名场面;产品经理用ChatGPT提效520倍;盘点13个SD最强模型;中国移动推出周杰伦数智人 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『ChatGPT访问量再创新高』强势挑战谷歌、百度的霸主地位 SimilarWeb 的统计数据显示&#xff0c;ChatGPT 在4月份的全球访问量已经达…

Tektronix泰克TCP2020 AC/DC电流探头

特征&#xff1a; 20 ARMS 最大电流能力 100 A 峰值脉冲电流能力 10 毫安/毫伏灵敏度 BNC 输出连接到大多数示波器和其他测量 设备&#xff08;需要 >100 kΩ 端接&#xff09; 用于直流偏移调整的消磁按钮和指轮 由交流适配器供电 易于使用且准确的交流/直流电流测量 DC 至…

专业恢复电脑数据软件Easyrecovery16

Easyrecovery是一款强大的数据恢复软件&#xff0c;它专门解决磁盘数据恢复问题。在计算机世界里&#xff0c;数据丢失经常是一件令人头疼的事情&#xff0c;但是有了Easyrecovery&#xff0c;您可以放心大胆地享受数据备份和恢复的乐趣。 Easyrecovery具有快速和有效的数据恢复…

HBase:Hadoop生态系统中的分布式NoSQL数据库【上进小菜猪大数据系列】

&#x1f4ec;&#x1f4ec;我是上进小菜猪&#xff0c;沈工大软件工程专业&#xff0c;爱好敲代码&#xff0c;持续输出干货&#xff0c;欢迎关注。 Hadoop中的HBase: 分布式NoSQL数据库 在大数据时代&#xff0c;数据量的爆炸式增长对数据存储和处理能力提出了巨大的挑战。…

滋灌中小企业,分销伙伴和华为来做“送水人”

最近有个段子&#xff1a;第一批靠生成式AI赚大钱的人&#xff0c;既不是研发人员&#xff0c;也不是国内大厂&#xff0c;而是卖课的。 大家笑谈&#xff0c;每一轮新技术的掘金之路&#xff0c;最先致富的都是送水、卖铲子的。 这其实隐藏了一个信息技术产业的普遍规律&#…

Kali-linux目录加密

在Kali中提供了一个目录加密工具TrueCrypt。该工具是一款开源的绿色加密卷加密软件&#xff0c;不需要生成任何文件即可在硬盘上建立虚拟磁盘。用户可以按照盘符进行访问&#xff0c;所以虚拟磁盘上的文件都被自动加密&#xff0c;访问时需要使用密码解密。TrueCrypt提供多种加…

C语言简述、特点、常用编译器,VS2010写第一个C语言程序

今天来分享C语言的基础知识&#xff0c;以及怎么用VS2010写第一个C语言程序&#xff0c;话不多说&#xff0c;开始上菜&#xff1a; 此博主在CSDN发布的文章目录&#xff1a;我的CSDN目录&#xff0c;作为博主在CSDN上发布的文章类型导读 目录 1.程序语言简述2.C语言简述3.C语言…

『Vue组件』Web Components 原生组件化

在学习Vue插槽&#xff08;Slots&#xff09;之前&#xff0c;我们可以先对Web Components的概念进行一个了解。因为Vue的模板系统&#xff0c;组件实现以及插槽相关的实现是参考于Web Components标准进行的上层设计。 在Vue中通过自定义组件、自定义标签以及自定义属性配合使用…

c++注入dll调用call

1.先写个我们要调用的函数 #include<iostream> using namespace std; void test(int a, int& b) { cout << a << b << endl; b a b; }void main() { int a 2; int b0; test(a, b); cout << b << endl; system("pause");…

再鼎医药面临严重的监管和产品竞争风险

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 再鼎医药&#xff08;ZLAB&#xff09;是一家生物制药公司&#xff0c;致力于开发和商业化癌症和传染病的创新疗法。该公司的产品组合包括用于治疗卵巢癌的靶向药Zejula&#xff0c;用于治疗脑癌的Optune&#xff0c;用于治…

Eplan2022 复制已有的宏文件生成新的原理图宏文件

下图所示为wago的787-722稳压电源&#xff0c;我们可以从官网下载到相应的eplan宏文件并导入数据源库。但是能下载到eplan宏文件的只是少部分公司的部件。那么没有宏文件的部件该怎么办&#xff1f; 接下来以明纬开关电源 NDR-120-24为例&#xff0c;创建一个宏文件。选择【主数…

linux密码忘了?一招解决

目录 一、前言 二、进入编辑界面 三、单用户模式 四、修改密码 五、更新信息 六、退出 七、验证 一、前言 版本&#xff1a;centos7.9、VMware15.5 在我们学习linux运行级别的时候&#xff0c;面试题可能会出如何找回root密码&#xff0c;下面来详细的介绍一波&#xff…

Mysql索引+事务+存储引擎

索引 索引的概念 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于C语言的链表通过指针指向数据记录的内存地址&#xff09;。 使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索引表找…

day29_jdbc

今日内容 零、 复习昨日 一、JDBC 二、登录 三、ORM 零、 复习昨日 DDL (针对结构,库,表,列,索引) 最重要建表语句 create table emp(empno int primary key auto_increment,ename varchar(10) not null,sal double(10,2) default 3000,hiredate date unique )DML 增删改 inser…