20232420 2025-2026-1 《网络与系统攻防技术》实验一实验报告
1.实验内容
- 1)对目标文件pwn1,直接修改文件内容,使程序执行时跳转到getShell函数。
- 2)对目标文件pwn1,利用缓冲区溢出漏洞,覆盖返回地址,触发getShell函数。
- 3)对目标文件pwn1,注入一个shellcode并运行。
2.实验环境
VMware 虚拟机 Kali 系统。
3.实验过程
- 先复制两份pwn1文件。
![屏幕截图 2025-10-13 163919]()
3.1 直接修改程序机器指令,执行getShell
- 对目标文件pwn1反汇编。
![屏幕截图 2025-10-13 170434]()
![屏幕截图 2025-10-13 170444]()
![屏幕截图 2025-10-13 170535]()
- main函数在80484b5处要调用foo函数,正常流程CPU会执行 “EIP + d7ffffff”这个位置的指令。“d7ffffff”是补码,表示-41,41 = 0x29,80484ba + d7ffffff = 80484ba - 0x29正好是8048491这个值,最终会跳转到08048491处执行foo函数。
- 那么想要使其最终跳转到0804847d处执行getShell,只要修改“d7ffffff”为"0804847d - 80484ba"对应的补码就行,即c3ffffff。
![屏幕截图 2025-10-13 171801]()
![屏幕截图 2025-10-13 171657]()
![屏幕截图 2025-10-13 140050(1)]()
![屏幕截图 2025-10-13 140137(1)]()
- 再次反汇编查看main函数,可以发现原本调用foo函数已被改为调用getShell函数。
- 修改前:
![屏幕截图 2025-10-13 140441(1)]()
- 修改后:
![屏幕截图 2025-10-13 140412(1)]()
- 运行pwn20232420_1,有shell提示符#。
![屏幕截图 2025-10-13 172845]()
3.2 构造输入参数,造成BOF攻击
3.2.1 观察foo函数
- 反汇编观察foo函数,注意到三行代码。
![屏幕截图 2025-10-13 141341(1)]()
- 此处存在缓冲区溢出漏洞,缓冲区大小为28字节,但gets函数不会检查目标缓冲区的大小,可能导致缓冲区溢出。
3.2.2 确认输入字符串哪几个字符会覆盖到返回地址
- 使用gdb调试
![屏幕截图 2025-10-13 174035]()
- 先输入1111111122222222333333334444444455555555,eip的值为0x35353535
![屏幕截图 2025-10-13 142006(1)]()
- 再输入1111111122222222333333334444444412345678,eip的值变为0x34333231
![屏幕截图 2025-10-13 142105(1)]()
3.2.3 覆盖返回地址
- getShell的内存地址,通过反汇编时可以看到,即0804847d。注意eip的值是变为0x34333231,所以应该输入11111111222222223333333344444444\x7d\x84\x04\x08来覆盖返回地址。
- 构造输入字符串
![屏幕截图 2025-10-13 142858]()
- 然后将input的输入,通过管道符“|”,作为pwn1的输入,成功执行getShell。
![屏幕截图 2025-10-13 143218]()
3.3 注入Shellcode并执行
3.3.1 准备一段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\
3.3.2 准备工作
- 设置堆栈可执行,并关闭地址随机化。
![屏幕截图 2025-10-13 175820]()
3.3.3 构造要注入的payload
- 采用结构为:anything+retaddr+nops+shellcode。
- 要确定shellcode的位置。
![屏幕截图 2025-10-13 163427]()
- 上面最后的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。我们得把它改为shellcode的地址。
- 打开一个终端注入这段攻击buf:
![屏幕截图 2025-10-13 180440]()
- 再开另外一个终端,用gdb来调试pwn1这个进程。
![屏幕截图 2025-10-13 180903]()
![屏幕截图 2025-10-13 180856]()
- 通过设置断点,来查看注入buf的内存地址。
![屏幕截图 2025-10-13 161332]()
- 在另外一个终端中按下回车,继续。
![屏幕截图 2025-10-13 161339(1)]()
- 看到01020304了。
- shellcode的地址就是0xffffd2fc+4=0xffffd300,将原先的\x4\x3\x2\x1更换为\x00\xd3\xff\xff。
![屏幕截图 2025-10-13 163520]()
![屏幕截图 2025-10-13 163856]()
- 成功注入shellcode。
4.问题及解决方案
- 问题1:学习通上的execstack无法使用。
- 问题1解决方案:到网上下载execstack,复制到虚拟机内安装。
5.实验感悟
- 三个实践内容展示了三种不同的获得shell的方法,直接改写文件、利用bof漏洞和注入shellcode。跟着实验步骤走的过程中,简单了解了汇编指令、bof漏洞原理与利用、shellcode的注入方法,见识了网络攻防的冰山一角,在静态的实验环境下尚且要用许久,真实的攻防只会更加复杂。



























浙公网安备 33010602011771号