20192430 2021-2022-2 《网络与系统攻防技术》实验一实验报告
一、实验内容
实验对象:Linux可执行文件pwn20192430
程序正常运行:main函数调用foo函数,打印输入的字符串
实验目标:令main函数调用shellcode函数,实现Linux终端操作
有以下三种方法
1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
2.通过缓冲区溢出将返回值覆盖触发shellcode函数
3.注入一个新的shellcode并运行
二、实验过程
方法1
-
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
-
将文件重命名为pwn20192430,并进行运行,运行结果如下:
-
反汇编结果中核心代码如下
- main函数调用foo,对应机器指令为“ e8 d7ffffff”,想要修改调用关系,在4b0处将d7修改为c3即shellcode的地址即可
- 修改之后再次反汇编可以看出调用已经从foo变成了shellcode
方法2
-
通过缓冲区溢出将返回值覆盖触发shellcode函数
-
初步找出缓冲区边际,确定注入位置(35为5的ascii码)
- 精准定位缓冲区边际
- getShell的内存地址,通过反汇编时可以看到为0804847d
- 构造输入字符串
- xxd查看input文件是否达到预期
- 将input的数据当作管道作为程序的输入
- 可以看到成功注入
方法3
-
注入一个新的shellcode并运行
-
通过一系列准备设置将实验变为理想化环境便于进行
- 构造payload
- 注入buf
- 打开第二个终端调试该程序寻找注入地址
- 反汇编foo函数寻找注入点
- 逐步寻找shellcode注入位置
- 找到位置后注入shellcode
- 可以看出注入成功
三、问题及解决方案
- 问题1:shellcode注入成功但重启过后变成未成功
- 问题1解决方案:每次启动时应关闭地址随机化
- 问题2:第三种方法注入时显示段错误
- 问题2解决方案:仔细检查发现是shellcode地址错误,修改后则注入成功
四、学习感悟、思考等
本次实验通过两个方面即直接修改程序和通过缓冲区溢出实现对于程序的bof攻击,通过这次实验,对于linux的基本指令的认识更加深入,但是仍然不是很熟悉,对于缓冲区溢出有了初步认识并付诸于实践。本次实验是在较为理想的情况下实现的,实际情况会更加复杂,这也引起了我对于这门课程更大的兴趣,并在之后更加深入的学习。
最后感谢老师和同学对于实验问题的解答与帮助。