20192413宗俊豪 2021-2022-2 《网络与系统攻防技术》实验一实验报告
20192413宗俊豪 2021-2022-2 《网络与系统攻防技术》实验一实验报告
1.实验内容
1.通过直接修改机器指令改变程序的执行顺序
2.通过构造输入参数进行BOF攻击改变程序执行顺序
3.通过构造输入参数实现注入并运行shellcode
2.实验过程
2.1直接修改机器指令
-
通过objdump -d指令实现对pwn文件的反汇编
-
通过/main查找主函数并可以发现其中call 8048491
即调用了foo函数
-
修改“d7ffffff”为"getShell-80484ba"对应的补码(47d-4ba=c3ffffff)
-
复制pwn1-20192413文件至pwn-20192413,用vi指令浏览文件,用%!xxd指令使文件显示为16进制格式并用/d7找到修改位置,将d7修改为c3
-
用objdump -d指令反汇编pwn-20192413文件发现main函数中已经变为调用getshell函数
-
运行pwn1-20192413和pwn-20192413发现原文件会输出输入的字符修改后的文件变为了shell
2.2构造输入参数实现BOF攻击
-
用gdb指令运行pwn1-20192413
-
输入“1111111122222222333333334444444455555555”发现在eip中的值为ASCII的5
-
输入“1111111122222222333333334444444412345678”来判断覆盖堆栈上返回地址的位置,发现为1234所在位置,因此应用\x7d\x84\x04\x08来替换1234
-
把“11111111222222223333333344444444\x7d\x84\x04\x08\x0a”存储到input20192413文件中并用xxd指令查看文件的16进制格式
-
用cat指令回显将文件注入pwn1-20192413后的结果,结果为shell
2.3构造输入参数注入运行shellcode
-
首先用
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
-
构造要注入的payload:
- 采用anything+retaddr+nops+shellcode的结构
-
将构造好的payload注入shellcode20192413文件并用xxd指令查看其16进制形式
-
在一个新的终端中注入pwn1-20192413,在原终端中查看pwn1-20192413的进程号并用gdb调试
-
设置断点来查看注入的内存地址
-
查看堆栈可以看到shellcode所在位置为0xffffd180
-
将payload前边四字节地址改为0xffffd180
-
注入成功
3.问题及解决方案
- 问题1:在做完实验第一部分后用./pwn1运行文件提示找不到文件
- 问题1解决方案:kali版本过于老旧缺少32位编译环境,重装2022版kali
- 问题2:实验第三部分修改完payload注入后不成功
- 问题2解决方案:忽略了关闭地址随机化的操作,使程序在内存中的地址一直在变化,补上关闭随机化操作后即可正常运行
- 问题3:使用gdb指令,提示gdb command不存在
- 问题3解决方案:通过apt-get update和apt-get install gdb两条指令实现了对gdb的安装
4.学习感悟、思考等
本次实验通过直接修改内部机器指令和构造注入参数两个方向来实现改变文件执行顺序的目的。在实验中运用到了linux指令、缓冲区溢出以及堆栈的相关知识,通过本次实验也对这些知识进行了一定的巩固与深入,对于linux指令的运用也更加熟练。在实验中碰到了不少问题也通过上网查找以及尝试最终自己都成功独立解决,在今后的学习中也要理论与实践相结合,并坚持自己独立动手解决问题。