【CSAPP】探秘AttackLab奥秘:level 1的解密与实战

2024-03-08 17:10

本文主要是介绍【CSAPP】探秘AttackLab奥秘:level 1的解密与实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

⏰雅致吟赋:翠竹婆娑夏雨收,意随花香扬袅袅。 忧愁轻解梦初醒,光阴流水自逍遥。

📋 前言

 🎉欢迎大家关注🔍点赞👍收藏⭐️留言📝

​ 🔔作者留言:

欢迎来到我的【CSAPP】攻击实验室!这里是探索计算机系统安全领域的秘境,我的学习笔记博客将引导你进入CSAPP的攻击之门。在这个实验室中,我不仅分享计算机系统的基本原理和高级技术,还涵盖了实用的攻击技术和项目经验的秘密武器。无论你是初学者还是安全大师,这个实验室将为你呈现学术与实践的魔法,助你在CSAPP的攻击领域中展开一场刺激的冒险。准备好了吗?跟随我的引导,让我们一同挑战那些神秘的攻击代码,揭开计算机系统安全的神秘面纱!

目录

📋 前言

🌳1. CSAPP与AttackLab简介

🌼1.1 CSAPP

🌼1.2 AttackLab

🌳2. AttackLab

🌼2.1 实验环境

🌼2.2 实验过程

🌼2.3 level 1

🌻2.3.1 解决思路

🌻2.3.2 问题验证

🌼2.4 实验结果

🌼2.5 实验体会

📝 总结 


🌳1. CSAPP与AttackLab简介

🌼1.1 CSAPP

《CSAPP》是指计算机系统基础课程的经典教材《Computer Systems: A Programmer's Perspective》,由Randal E. Bryant和David R. O'Hallaron编写。该书的主要目标是帮助深入理解计算机系统的工作原理,包括硬件和软件的相互关系,其涵盖了计算机体系结构、汇编语言、操作系统、计算机网络等主题,旨在培养学生系统级编程和分析的能力。


🌼1.2 AttackLab

target1实验通常与CS:APP书中的“Buffer Overflow Attack”相关。这个实验旨在教授计算机系统的安全性,防止攻击者定位攻击和锻炼使用金丝雀防护,特别是关于缓冲区溢出漏洞的理解和利用。在这个实验中,尝试利用缓冲区溢出漏洞来修改程序的执行流程,从而实现未授权的操作,比如执行恶意代码或获取系统权限。要求深入了解程序内存布局、堆栈和函数调用等概念,并学会利用输入缓冲区溢出漏洞来修改程序行为,这有助于理解系统安全中的一些基本原则和漏洞。

资源获取:关注公众号【科创视野】回复  csappattacklab


🌳2. AttackLab

🌼2.1 实验环境

  • VMware Workstation虚拟机环境下的Ubuntu 64位。

🌼2.2 实验过程

实验准备阶段:首先需要使用ubuntu联网环境跳转到链接下载实验所需的attacklab:attacklab源文件

下载target1压缩包并输入

tar –xvf target1.tar

进行解压缩,进入该目录所有文件如下所示:

​​​

当前提供材料包含一个攻击实验室实例的材料:

1.ctarget

带有代码注入漏洞的Linux二进制文件。用于作业的第1-3阶段。

2.rtarget

带有面向返回编程漏洞的Linux二进制文件。用于作业的第4-5阶段。

3.cookie.txt

包含此实验室实例所需的4字节签名的文本文件。(通过一些Phase需要用到的字符串)

4.farm.c

rtarget实例中出现的gadget场的源代码。您可以编译(使用标志-Og)并反汇编它来查找gadget。

5.hex2raw

生成字节序列的实用程序。参见实验讲义中的文档。(Lab提供给我们的把16进制数转二进制字符串的程序)

在终端处输入命令

tar -xvf target1.tar

将压缩包解压如下:

​​​

图3-2

实验过程阶段:

使用

objdump -d ctarget > ctarget.asm

objdump -d rtarget > rtarget.asm

对ctarget以及rtarget进行反汇编,得到ctarget.asm和rtarget.asm。

​​​

在官方文档的目标程序给出,CTARGET和RTARGET都从标准输入读取字符串。它们使用下面定义的函数getbuf来执行此操作:

​​

函数Gets类似于标准库函数gets—它从标准输入中(从缓冲区)读取字符串 (以’ \n '或文件结束符结束) 并将其(连同空结束符)存储在指定的目的地。即空格/Tab/回车可以写入数组文本文件,不算作字符元素, 不占字节,直到文件结束, 如果是命令行输入的话,直到回车结束(区别getchar ():是在输入缓冲区顺序读入一个字符 (包括空格、回车和 Tab)结束,scanf:空格/Tab/回车都当作结束。函数Gets()无法确定它们的目标缓冲区是否足够大,以存储它们读取的字符串。它们只是复制字节序列,可能会超出在目的地分配的存储边界(缓冲区溢出)对应汇编代码:

​​

因为Ctarget就是让我们通过缓冲区溢出来达到实验目的,所以可以推断sub $0x28,%rsp的40个字节数就等于输入字符串的最大空间,如果大于40个字节,则发生缓冲区溢出(超过40个字节的部分作为函数返回地址,如果不是确切对应指令的地址,则会误入未知区域,报错:

Type string:Ouch!: You caused a segmentation fault!段错误,可能访问了未知额内存)


🌼2.3 level 1

对于Level 1,您将不会注入新代码。相反,您的漏洞利用字符串将重定向程序以执行现有过程。函数getbuf由具有以下C代码的函数测试在CTARGET中调用:

​​

当getbuf执行其返回语句(getbuf的第5行)时,程序通常会在函数测试中恢复执行(在该函数的第5行里)。我们想改变这种行为。在文件ctarget中,有一个函数touch1的代码,具有以下C表示:

​​​

任务是让CTARGET在getbuf执行其return语句时执行touch1的代码,而不是返回测试。请注意,您的漏洞利用字符串也可能损坏与此阶段没有直接关系的堆栈部分,但这不会导致问题,因为touch1会导致程序直接退出。


🌻2.3.1 解决思路

在输入了字符串后,需要经过touch1 函数部分(而不是执行test的返回语句),即缓冲区需要溢出,如果缓冲区不溢出,则在运行test函数后就结束了,不会经过touch1

touch1对应的汇编代码:

​​​

原理:一个函数在调用另外一个函数时,首先需要把下一条指令位置在栈上保存下来,然后再为另外一个函数提供新空间,当另一个函数结束时%rsp回到这个保存的位置 (与没有溢出的区别是,被调用的函数溢出时返回地址被改写)跳转到touch1的条件:

test()调用getbuf(),而getbuf()函数可以造成溢出,可以 溢出到存放返回地址的内存(touch1),并且可以把返回地址改写(改写为touch1的地址,若不溢出,则getbuf()的返回地址为test,即继续执行调用getbuf()后的下一条语句)。我们只要把touch1()函数的起始地址写入进getbuf()函数的返回地址,就可以完成。即test()->getbuf()->…->getbuf()->test()变成test()->getbuf()->…->getbuf()->touch1()。

当缓冲区输入达到40个字符时,再输入的字符如果是 0x4017c0(touch1的第一条指令位置),就会把之前函数保存的位置覆盖掉,那么当Gets函数结束后,就会跳转到touch1。

发生溢出的原因为输入的字符串中包括了写返回地址的字符串,所以大于40个字节;

不溢出的条件 为只输入40个字节的字符串,不写返回地址

但是经检验:当只输入40个字节,不写返回地址时:原本应该Type String:No exploit.Getbuf returned 0x%x\n,即继续执行调用getbuf()后的下一条printf语句,但是却得到Type String:Oops!: You executed an illegal instruction,原因尚未可知(猜想可能与本实验的设计有关,因为工具hex2raw是把16进制数转二进制字符串的程序,可能需要输入有效16进制数。

输入44个字节,显示错误:

​​​

解决:任意输入40个16进制数(相当未知额内存,不对应具体指令)和0x4017c0 (小端法),hex2rax将输入的16进制数转换为字符串,修改level1.txt文本如下:

​​​


🌻2.3.2 问题验证

输入./hex2raw < Hex1.txt | ./ctarget -q进行验证如下所示:

​​​

设计此级别的漏洞利用字符串所需的所有信息都可以通过检查反汇编版本的CTARGET来确定。使用objdump-d可以获得这个经过分解的版本。其想法是定位touch1起始地址的字节表示,以便getbuf代码末尾的ret指令将控制权转移到touch1。​​​


🌼2.4 实验结果

由于实验通关过程中是分阶段的,故展示通关过程中所需的创建文件如下:

​​​


🌼2.5 实验体会

  1. 深度挖掘CSAPP的实践意义: AttackLab实验深度剖析了CSAPP课程中的实践部分,通过解密level 1的设计与实战,我深刻领悟到理论知识在实际系统编程中的应用。这实验不仅强化了我对计算机系统底层原理的理解,还培养了解决实际安全挑战的能力。

  2. 挑战底层编程技术的乐趣: AttackLab的实践过程充满了挑战,但正是这种挑战让我感受到底层编程技术的深度和乐趣。通过解密和攻击的实际操作,我逐渐掌握了底层系统的编程要领,体验到了编程中的创造性和发现性的乐趣。

  3. 拓展对计算机系统安全性的认知: AttackLab实验通过深入攻关的方式,拓展了我对计算机系统安全性的认知。解密level 1的过程中,我不仅发现了系统中潜在的漏洞,更学到了如何加强系统的安全性。这种实践经验对于今后深入研究计算机系统安全问题起到了重要的引导作用。


📝 总结 

在计算机系统的广袤领域,仿佛是一片未被揭示的复杂网络,隐藏着深奥的密码,而CSAPP的AttackLab实验正是那一场引人入胜的冒险之旅。这实验不仅深入挖掘计算机系统的基本概念,更将目光投向底层的系统实现,逐步揭开计算机系统内核、汇编语言和数据结构这些层次的神秘面纱。

对于那些渴望挑战计算机系统安全学习路径,以及希望掌握底层系统编程技术的冒险者们,AttackLab提供了一个独特的机会。点击下方链接,你将能够深入研究计算机科学的奇迹,探讨安全编程技术的实际应用和创新。我们引领趋势的🌱计算机科学专栏《斯坦福大学之CSAPP》将为你展开一场精彩的学术冒险,带你穿越计算机系统的迷雾,解锁其中的奥秘。🌐🔍

这篇关于【CSAPP】探秘AttackLab奥秘:level 1的解密与实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation:做参数校验Mybatis:做数据库的操作Redis:做缓存Junit:单元测试项目部署:springboot项目部署相关的知识 (3)前端 Vite:Vue项目的脚手架Router:路由Pina:状态管理Eleme

深度学习实战:如何利用CNN实现人脸识别考勤系统

1. 何为CNN及其在人脸识别中的应用 卷积神经网络(CNN)是深度学习中的核心技术之一,擅长处理图像数据。CNN通过卷积层提取图像的局部特征,在人脸识别领域尤其适用。CNN的多个层次可以逐步提取面部的特征,最终实现精确的身份识别。对于考勤系统而言,CNN可以自动从摄像头捕捉的视频流中检测并识别出员工的面部。 我们在该项目中采用了 RetinaFace 模型,它基于CNN的结构实现高效、精准的

项目实战系列三: 家居购项目 第四部分

购物车 🌳购物车🍆显示购物车🍆更改商品数量🍆清空购物车&&删除商品 🌳生成订单 🌳购物车 需求分析 1.会员登陆后, 可以添加家居到购物车 2.完成购物车的设计和实现 3.每添加一个家居,购物车的数量+1, 并显示 程序框架图 1.新建src/com/zzw/furns/entity/CartItem.java, CartItem-家居项模型 /***

Birt报表开发实战

我就截图描述得了,没什么含金量,看图基本明白的。 1.开始 a.创建报表文件 b.数据源配置 c.配置数据集 2.网格报表 拖拉式操作,很方便 3.预览效果 其他报表的操作也基本不难,就不扯了! 2.级联参数 官方视频教程:http://demo.actuate.com/demos/cascade/cascade.html

[yolov5] --- yolov5入门实战「土堆视频」

1 项目介绍及环境配置 下载yolov5 tags 5.0源码,https://github.com/ultralytics/yolov5/tree/v5.0,解压 Pycharm 中创建conda虚拟环境 激活conda虚拟环境 根据作者提供的requirements.txt文件,pip install -r requirements.txt 如果作者没有提供requirement.txt文件