Attack lab
一:实验梗概
Attack lab:要求你进行五次攻击。攻击方式是code injection代码注入和Reeturn-oriented programming(ROP),在你做完这个lab,你会收获:
- 你将知道当程序没有做缓冲区溢出安全时,黑客是如何攻击程序的。
- 你将知道编译器和操作系统是如何增强程序的健壮性。
- 你将明白怎么编写更安全的程序
- 你将明白x86-64构架下,程序是如何使用栈和参数传递。
- 你将学会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 >