深入理解计算机系统attack lab

这里写图片描述

Attack lab

一:实验梗概

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

  1. 你将知道当程序没有做缓冲区溢出安全时,黑客是如何攻击程序的。
  2. 你将知道编译器和操作系统是如何增强程序的健壮性。
  3. 你将明白怎么编写更安全的程序
  4. 你将明白x86-64构架下,程序是如何使用栈和参数传递。
  5. 你将学会GDB和OBJDUMP的用法。
    文件列表:
    |文件|用途
    |–|--
    |ctarget|用来做Code injection攻击的程序
    |rtarget|用来做ROP攻击的程序
    |cookie.txt|作为攻击的标识符
    |hex2raw|用来生成工具字符串
    |farm.c|稍后解释
    任务:
    这里写图片描述
    话不多说,开始Attack

二:实验准备

GDB

OBJDUMP

ctarget

被攻击程序之一,在该程序里,会首先执行getbuf函数,读取标准输入。
其中Gets函数于书中gets函数类似。
BUFFER_SIZE不告诉你,你自己去找。

unsigned getbuf()
{
	char buf[BUFFER_SIZE];
	Gets(buf);
	return 1;
}

参数 (ctarget和rtarget都有)
-q 不发送成绩
-i 从文件中输入
如果你没有使用-q,就会出现

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

因为你没有使用CMU的内网,是无法建立连接的。所以你每次进行操作都要带上-q。我用的最多的是-qi.

Code Injection

通过使缓冲区溢出,注入攻击代码。

ROP

介绍下return-oriented programming是什么意思吧。
ROP即使用你程序里的字节代码攻击你的程序。听起来有些神奇,举个例子:

void setval_210(unsigned *p)
{
	*p = 3347663060U;
}

这个程序看起来很普通,但如果反汇编成机器字节代码

0000000000400f15 <setval_210>:
400f15: c7 07 d4 48 89 c7 movl $0xc78948d4,(%rdi)
400f1b: c3 retq

仔细看: 48 89 c7可以编码为movq %rax,%rdi,c3可以编码为ret。如果程序从0x400f18开始执行,将执行

movq %rax,%rdi 
ret

这种带有ret的指令段,称为gadget,而farm.c里有很多这种garget。你可以利用这些garget进行攻击。
(注:farm.c已经编译进了rtarget,也就是说,你反汇编rtarget时,你就会找到farm.c里的函数)
这里写图片描述
这里写图片描述
这里写图片描述

ret c3
nop 90

hex2raw

将16进制转换为字符串,这样,机器才能识别。
用法:
将1.txt文件里的内存转换为字符串并输出到2.txt

./hex2raw <1.txt >
### 深入理解计算机系统的基础教程与资源 #### 计算机系统的层次结构 计算机系统由多个抽象层组成,每一层都建立在其下一层之上。最底层是硬件层,包括CPU、内存和其他物理组件;上层则是操作系统、编程语言运行环境以及应用程序[^1]。 #### CPU的工作机制 中央处理器(CPU)负责执行程序中的指令序列。当遇到`ret`这样的返回指令时,实际上会从堆栈中取出先前保存的指令指针(IP),并将其赋给IP寄存器以继续执行后续代码。 ```assembly ; 假设这是一个函数调用后的场景 call some_function ; 调用某个子过程前自动压入当前EIP+5到栈顶作为返回地址 ... some_function: push ebp ; 保护旧基址 mov ebp, esp ; 设置新帧指针 sub esp, local_size ; 分配局部变量空间 ... pop eax ; 准备退出该函数体之前恢复eax等通用目的寄存器状态 leave ; 清理堆栈框架(相当于 mov esp,ebp / pop ebp ) ret ; 返回至上一级调用者处 (即实现 POP EIP) ``` 上述汇编片段展示了如何通过`ret`来完成一次标准的过程间转移操作,在此过程中涉及到对栈的操作以及控制流的变化。 #### 学习路径建议 对于希望深入了解计算机体系结构的学习者来说,《深入理解计算机系统》是一本非常有价值的书籍。书中不仅讲解了理论概念,还提供了实践性的实验项目如Attack Lab帮助读者更好地掌握所学知识。 另外,还可以考虑以下几种方式加深理解和应用能力: - **在线课程**:Coursera上的“Computer Architecture Specialization”,edX平台提供的“Introduction to Computer Science and Programming Using Python”。 - **开源项目贡献**:参与Linux内核开发或其他大型软件项目的维护工作可以极大地提升实际动手能力和解决问题的经验。 - **虚拟化技术探索**:利用QEMU/KVM搭建自己的实验室环境来进行各种尝试而不必担心破坏真实机器的状态。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值