当前位置: 首页 > news >正文

CSAPP Lab3- bufbomb

实验目标

(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~

相关文章:

CSAPP Lab3- bufbomb

实验目标 &#xff08;1&#xff09;掌握函数调用时的栈帧结构 &#xff08;2&#xff09;利用输入缓冲区的溢出漏洞&#xff0c;将攻击代码嵌入当前程序的栈帧中&#xff0c;使得程序执行我们所期望的过程 实验代码 &#xff08;1&#xff09;makecookie&#xff1a;生成c…...

分布式系统之CAP定理介绍

前言 在分布式系统的设计和实现中&#xff0c;CAP定理是一个非常重要的概念。本文将介绍CAP定理的概念、含义和应用。 什么是 CAP 定理&#xff1f; CAP定理是分布式系统设计中的一个基本原则&#xff0c;它指出&#xff0c;在分布式系统中&#xff0c;一致性&#xff08;Consi…...

vcomp140.dll怎么安装?提示vcomp140.dll丢失怎样修复?

在用电脑玩游戏或者打开软件工作的时候&#xff0c;电脑提示vcomp140.dll丢失无法执行此代码&#xff0c;是什么回事呢&#xff1f;需要怎么修复呢&#xff1f;不用紧张&#xff0c;小编今天就把vcomp140.dll文件修复方法分享给大家。我总结了几个修复经验&#xff1b; vcomp14…...

CA OpenSSL自签名证书(服务器/客户端)

参考文章 https://juejin.cn/post/7092789498823573518 https://blog.csdn.net/mengting2040/article/details/120001810 目录 使用 OpenSSL 生成证书创建根证书创建 Root Pair创建 Root Key创建 Root Crt 创建服务器端证书创建服务器端keyip需要换成自己服务器的外网ip地址&am…...

计算机视觉(4)—— 未有深度学习之前

目录 四、未有深度学习之前 4.1 图像分割 4.1.1 基于阈值分割 4.1.2 基于边缘分割 4.1.3 基于区域分割 &#xff08;1&#xff09;区域生长法 &#xff08;2&#xff09;分水岭算法 4.1.4 基于图论分割 &#xff08;1&#xff09;Graph Cuts 分割 ​&#xff08;2&…...

怎么获取winform中动态代码生成的控件的状态

winform怎么获取动态代码生成窗口里面的控件的属性状态 MainForm中调用 private void ShowPropertyForm() { PropertyForm form new PropertyForm(selectedShape); form.ShowDialog(); pictureBox1.Refresh(); …...

Windows安装Maven并配置环境

Windows下安装和配置Maven的步骤 介绍&#xff1a;步骤&#xff1a;步骤 1&#xff1a;下载Maven步骤 2&#xff1a;解压缩Maven分发包步骤 3&#xff1a;设置环境变量步骤 4&#xff1a;验证安装 结论&#xff1a; 介绍&#xff1a; Maven是一个非常流行的构建和项目管理工具…...

致力于中小企业JavaEE企业级快速开发平台、后台框架平台

一、开源项目简介 J2eeFAST 是一个 Java EE 企业级快速开发平台&#xff0c; 致力于打造中小企业最好用的开源免费的后台框架平台 。系统基于&#xff08;Spring Boot、Spring MVC、Apache Shiro、MyBatis-Plus、Freemarker、Bootstrap、AdminLTE&#xff09;经典技术开发&…...

【神经网络】tensorflow实验9--分类问题

1. 实验目的 ①掌握逻辑回归的基本原理&#xff0c;实现分类器&#xff0c;完成多分类任务&#xff1b; ②掌握逻辑回归中的平方损失函数、交叉熵损失函数以及平均交叉熵损失函数。 2. 实验内容 ①能够使用TensorFlow计算Sigmoid函数、准确率、交叉熵损失函数等&#xff0c…...

LeetCode2. 两数相加

写在前面&#xff1a; 题目链接&#xff1a;LeetCode2两数相加 编程语言&#xff1a;C 题目难度&#xff1a;中等 一、题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 …...

基于无线传感网络(WSN)的目标跟踪技术(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 无线传感器网络由于其自组织性、鲁棒性及节点数量巨大的特点,非常适合于目标跟踪。无线传感器网络中的移动目标跟踪实际上就是…...

百度发布首个可信AI工具集TrustAI,助力数据分析与增强

百度发布首个集分析与增强于一体的可信AI工具集TrustAI&#xff0c;该工具集旨在帮助用户快速、准确地对各种类型的数据进行分析和增强&#xff0c;从而提高数据的价值和可信度。 随着人工智能技术的快速发展&#xff0c;数据的价值和重要性日益凸显。然而&#xff0c;在数据处…...

电力系统负荷与电价预测优化模型(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

asp.net+C#超市商品进销存管理系统

本超市商品管理系统主要超市内部提供服务&#xff0c;系统分为管理员员工两部分。 本研究课题重点主要包括了下面几大模块&#xff1a;管用户登录&#xff0c;员工管理&#xff0c;商品管理&#xff0c;进货管理&#xff0c;销售管理&#xff0c;供应商信息&#xff0c;会员信…...

轻量级K8s发行版的五大优势,助力企业快速拥抱边缘计算

随着物联网和移动设备的普及&#xff0c;边缘计算已成为当前信息技术领域的热门话题。为了满足这一需求&#xff0c;越来越多的企业开始探索使用容器化技术来打造轻量级的K8s发行版。这种发行版可以更加灵活地部署在物理边缘&#xff0c;提供更快速、更稳定的服务。 在这篇文章…...

【深入理解redis】数据结构

文章目录 动态字符串SDS字符串编码类型 intsetDictZipListZipList的连锁更新问题 QuickListSkipListRedisObjectStringListSet结构ZSETHash Redis 共有 5 种基本数据结构&#xff1a;String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Set&#xff08;…...

《计算机网络—自顶向下方法》 第三章Wireshark实验:DNS协议分析

域名系统 DNS(Domain Name System) 是互联网使用的命名系统&#xff0c;用于把便于大家使用的机器名字转换为 IP 地址。许多应用层软件经常直接使用 DNS&#xff0c;但计算机的用户只是间接而不是直接使用域名系统。 互联网采用层次结构的命名树作为主机的名字&#xff0c;并使…...

JUC(十二)-线程中断相关问题(LockSupport,sleep,InterruptException)

JUC线程中断相关问题总结 线程中断相关问题总结 JUC线程中断相关问题总结一、 sleep 和线程中断之间的关系和特点结论测试验证代码如下 二、 LockSupport 和线程中断之间的关系结论测试验证代码如下 一、 sleep 和线程中断之间的关系和特点 结论 线程调用 Thread.sleep之后会进…...

Kotlin高级协程

Kotlin高级协程 一.前言二.先从线程说起三.协程的设计思想四.协程特点&#xff1a;优雅的实现移步任务五.协程基本使用六.协程和线程相比有什么特点&#xff0c;如何优雅的实现异步任务 一.前言 在文章正式上干货之前&#xff0c;先说一点背景吧&#xff1b;我是 Kotlin 协程官…...

车载软件架构——闲聊几句AUTOSAR BSW(四)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 我们并不必要为了和谐,而时刻保持通情达理;我们需要具备的是,偶尔有肚量欣然承认在某些方面我们可能会有些不可理喻。该有主见的时候能掷地有声地镇得住场…...

NSSCTF做题记录九 | [HUBUCTF 2022 新生赛]checkin

[HUBUCTF 2022 新生赛]checkin <?php show_source(__FILE__); //高亮显示当前代码 $username "this_is_secret"; //给$username赋值 $password "this_is_not_known_to_you"; //给$password赋值 include("flag.php");//here I chan…...

云容笔谈在自媒体内容生产中的提效实践:日更国风配图效率提升300%

云容笔谈在自媒体内容生产中的提效实践&#xff1a;日更国风配图效率提升300% 1. 自媒体内容创作的痛点与挑战 作为自媒体创作者&#xff0c;每天最头疼的就是配图问题。特别是做国风内容的账号&#xff0c;既要保持东方美学韵味&#xff0c;又要保证日更频率&#xff0c;传统…...

如何高效使用Super IO插件:Blender批量导入导出终极指南

如何高效使用Super IO插件&#xff1a;Blender批量导入导出终极指南 【免费下载链接】super_io blender addon for copy paste import / export 项目地址: https://gitcode.com/gh_mirrors/su/super_io 想要在Blender中实现一键导入导出模型和图像吗&#xff1f;Super I…...

ctfshow-web进阶-命令执行绕过技巧(web71-web74)

1. 命令执行漏洞基础与CTF常见场景 命令执行漏洞&#xff08;Command Execution&#xff09;是Web安全中一种高危漏洞&#xff0c;它允许攻击者在服务器上执行任意系统命令。在CTF比赛中&#xff0c;这类题目通常会模拟真实环境中开发者未对用户输入进行严格过滤的场景。 我刚开…...

Windows 10 64位系统下Neo4j社区版与桌面版安装全攻略(2023最新版)

1. Neo4j简介与安装准备 如果你正在寻找一款强大的图数据库来管理复杂的关系数据&#xff0c;Neo4j绝对是个不错的选择。作为目前最流行的开源图数据库&#xff0c;它用起来就像在画一张巨大的网络图——每个节点代表实体&#xff08;比如人或产品&#xff09;&#xff0c;每条…...

【Python并发革命】:GIL解除后首个生产级无锁插件生态正式开放下载(限时72小时)

第一章&#xff1a;Python并发革命的里程碑意义 Python 并发模型的演进并非渐进式改良&#xff0c;而是一场深刻重塑编程范式的革命。从早期依赖线程与锁的阻塞式模型&#xff0c;到 asyncio 的异步 I/O 抽象、async/await 语法糖的引入&#xff0c;再到结构化并发&#xff08;…...

Metro性能监控终极指南:如何快速分析和优化React Native打包构建过程

Metro性能监控终极指南&#xff1a;如何快速分析和优化React Native打包构建过程 【免费下载链接】metro &#x1f687; The JavaScript bundler for React Native 项目地址: https://gitcode.com/gh_mirrors/me/metro Metro作为React Native的官方JavaScript打包工具&a…...

FlexASIO:打破专业音频门槛,让普通设备也能拥有专业级ASIO体验

FlexASIO&#xff1a;打破专业音频门槛&#xff0c;让普通设备也能拥有专业级ASIO体验 【免费下载链接】FlexASIO A flexible universal ASIO driver that uses the PortAudio sound I/O library. Supports WASAPI (shared and exclusive), KS, DirectSound and MME. 项目地址…...

让你的调试日志五彩斑斓:J-Link RTT高级封装技巧(支持中文、浮点数、十六进制)

让你的调试日志五彩斑斓&#xff1a;J-Link RTT高级封装技巧&#xff08;支持中文、浮点数、十六进制&#xff09; 调试是嵌入式开发中不可或缺的一环&#xff0c;而高效的调试工具能显著提升开发效率。J-Link RTT&#xff08;Real Time Transfer&#xff09;作为一种无需额外硬…...

Qwen3-ASR-0.6B方言识别效果展示:粤语、四川话实测

Qwen3-ASR-0.6B方言识别效果展示&#xff1a;粤语、四川话实测 1. 引言 语音识别技术发展至今&#xff0c;已经能够很好地处理普通话和英语等主流语言&#xff0c;但方言识别一直是技术难点。不同地区的方言在发音、语调、词汇上都有很大差异&#xff0c;让机器准确识别并非易…...