学号 2025-2026-1 《网络与系统攻防技术》实验一实验报告
1.实验内容
1.1 目标任务
- a.对一个存在漏洞的pwn文件,直接修改其机器指令从而改变执行过程,运行getShell得到可用Shell
- b.对一个存在漏洞的pwn文件,通过构造特殊的输入字符串覆盖返回地址从而跳转执行getShell函数
- c.对一个存在漏洞的pwn文件,注入shellcode并运行得到可用Shell
1.2 学习内容
- a.掌握反汇编、gdb调试与十六进制编辑器
- b.能正确修改机器指令改变程序执行流程
- c.能正确构造payload进行BOF攻击
2.实验过程
2.1 环境准备
-
下载kali镜像文件,并挂载在VMWare上
-
通过共享文件夹传递实验文件pwn1
2.2 通过直接修改程序机器指令getShell
-
通过objdump命令对实验文件进行反汇编,查看核心源代码
-
通过查看得知main函数调用foo对应的机器指令为
e8 d7ffffff
,foo函数位于地址0x08048491
处,CPU跳转执行EIP + 0xd7ffffff
这个位置的指令,0xd7ffffff
是-41
的补码,因此可以计算出EIP保存的值为0x080484ba
,现在我们希望通过修改e8 d7ffffff
来使程序跳转执行getShell,因此先查看getShell函数的地址addr<getShell>
为0x0804847d
,计算addr<getShell>-EIP
得到操作数c3ffffff
,因此将机器指令e8 d7ffffff
修改为e8 c3ffffff
即可,以下为修改过程
2.3 构造输入进行BOF攻击
- 通过反汇编观察计算,我们知道foo函数使用了一个只预留28(0x1c)字节的缓冲区来读取字符串,call调用foo,同时在堆栈上压上返回地址值
0x080484ba
,我们通过gdb调试找到覆盖返回地址的注入点即能构造输入跳转执行getShell,以下为具体过程
2.4 ShellCode注入
-
准备Shellcode:
\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\
-
修改程序执行环境:设置堆栈可执行,关闭地址随机化
-
选择payload构造结构:
anything+retaddr+nop+shellcode
,前面计算字符串缓冲区可知返回地址之前有32字节需要填充,所以anything部分为'A'x32
,我们要确定的是retaddr的值,可知要执行的shellcode就在retaddr的后面(落在nop上会自动滑行至shellcode部分),因此我们输入payloadprint "A" x 32;print "\x04\x03\x02\x01\x90\x90\x90\x90\x90\x90\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\x90\x00\xd3\xff\xff\x00"
(perl)来进行调试,如图 -
首先将payload作为输入给到程序
-
在另一窗口中找到PID进入gdb调试
-
在gdb中foo的返回函数处设置断点
-
继续执行至断点处,查看esp中的值,找到返回函数的地址,查看确认是我们所预设的位置,由此可以得到shellcode地址为
0xffffcf90
-
将返回地址修改为shellcode地址,输入执行即可得到shell
3.问题及解决方案
- 问题1:无法下载execstack
- 问题1解决方案:在网络上下载execstack的deb包,在虚拟机内本地安装
4.学习感悟、思考等
在本次实验中我系统了解了BOF漏洞的原理和利用方法,尤其对ShellCode注入有了更深的理解,在首次进行实验时,我急于验证方法的正确性,直接将完整的ShellCode进行注入,结果失败,后来一步步分析,发现是返回地址找错了,这一过程使我更加深入地了解了ShellCode注入方法。完成ShellCode注入后有一种成就感,但本实验是在设置了堆栈可执行且关闭了地址随机化,真实的BOF攻击往往会更加复杂,相关的程序员更要从多个角度加强程序安全性,抵御类似的攻击,一旦对方攻击成功拿到Shell很可能会造成极大的损失。
参考资料
- 逆向与Bof基础
- 【干货分享】手把手简易实现shellcode及详解