20252905 2025-2026-2 《网络攻防实践》第九周作业

20252905 2025-2026-2 《网络攻防实践》第九周作业

实践内容

1.知识点梳理与总结

实践任务 核心原理 关键技术 关键汇编/机器码
1. 修改程序执行路径 修改二进制文件,将call foo改为jmp getShell objdump反汇编、xxd十六进制编辑 calle8
jmpe9
2. BOF触发getShell 缓冲区溢出覆盖返回地址,跳转至getShell gdb调试、perl构造payload ret返回指令
getShell地址覆盖
3. 注入Shellcode 注入Shellcode,跳转至缓冲区执行 NOP sled、关闭ASLR NOP0x90
int 0x80系统调用

2.实验过程

任务1:

1.解压学习通文件,并进行重命名,对其进行反汇编操作
image
输入命令进行反汇编 objdump -d pwn1_20252905zzy | more
image

2.查看对应函数
image

3.安装xxd,输入apt install xxd
image

4.输入解压文件名 vim pwn1_20252905zzy
image

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

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

7.查看main函数调用信息
image

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

任务2:

1.设置溢出值
image

2.安装gdb
image

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

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

5.尝试调用getshell
image
输入:perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > pwn20252905_input
xxd pwn20252905_input
image
输入(cat pwn20252905_input; cat) | ./pwn20252905 ,ls查看后,发现已获取到目标权限
image

任务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

image

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

3.查看地址随机化情况
image

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

image

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

image

6.查看栈顶指针位置
image

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

3.学习中遇到的问题及解决

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

解决方案:一定要先转化为二进制再保存,否则后续操作无法进行,正确操作为 按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等机制正是为了阻断此类攻击。这次实践不仅锻炼了我的动手能力,更让我对软件漏洞利用与防御有了从理论到实践的完整认知。

参考资料

教学视频

posted @ 2026-05-11 14:14  Rainloop  阅读(6)  评论(0)    收藏  举报