20253905 2025-2026-2 《网络攻防实践》实践九报告

20253905 2025-2026-2 《网络攻防实践》实践九报告

1.实践内容

1.1实践内容

本次实践以Linux可执行文件pwn1为实验靶机程序,该程序原生逻辑为main函数调用foo函数实现输入字符串回显,内置getShell函数可提供系统交互Shell但默认不会执行。围绕让程序强制执行getShell、利用栈溢出漏洞劫持程序流、注入自定义Shellcode三个核心目标,完成三项实践:

  • 采用手工修改二进制机器指令的方式,直接篡改程序原有执行逻辑,绕过foo函数强制跳转至getShell;
  • 分析foo函数存在的缓冲区溢出 (BOF) 漏洞,精准计算栈偏移量,构造攻击Payload覆盖函数返回地址,间接调用getShell获取Shell;
  • 关闭系统防护机制、开启栈执行权限,通过GDB调试定位栈内存地址,构造包含NOP滑板的自定义Shellcode并注入程序,实现任意Shellcode的执行。

1.2相关知识

  1. 核心汇编指令及机器码
  • 掌握NOP空指令、JMP跳转、JE/JNE条件跳转、CMP比较指令的功能与对应机器码;其中NOP指令机器码为0x90,常用于构造NOP滑板,增大Shellcode命中地址的概率。
  1. 反汇编与十六进制编辑工具
  • objdump:Linux经典反汇编工具,可解析可执行文件汇编代码,定位函数入口地址、分析栈帧与指令逻辑,是二进制程序逆向分析基础工具;
  • hexedit:十六进制编辑器,可直接修改可执行文件的机器指令字节,实现不重新编译情况下篡改程序执行逻辑。

2.实践过程

2.1 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

  • 修改主机为本人姓名拼音,修改文件名
    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 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

  • 执行命令关闭Linux系统的地址空间随机化(ASLR),消除栈地址随机变化对栈溢出实验的干扰
    image
    image
  • 使用objdump命令反汇编目标程序,提取出main、foo、getShell函数的内存地址,为后续漏洞利用定位关键入口点。
    image
  • 使用objdump命令反汇编并查看foo函数的汇编指令,分析其栈帧结构,计算出缓冲区到函数返回地址的偏移量
    image
  • 使用Python生成缓冲区溢出攻击Payload文件,并通过管道将其输入目标程序,成功劫持程序执行流至getShell函数,获取交互式Shell并执行ls命令验证攻击成功
    image

2.3 注入一个自己制作的shellcode并运行这段shellcode。

  • 输入命令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命令验证攻击成功。

4.实践总结

本次网络攻防实践以pwn1程序为对象,完成三项实验:手动修改二进制指令改变程序流程、利用缓冲区溢出漏洞构造 Payload 劫持执行流、注入自定义Shellcode并成功运行。实验中熟练运用objdump、hexedit、GDB及pwntools工具,掌握反汇编分析、十六进制编辑、栈偏移量测算方法。了解了ASLR地址随机化、栈执行保护、NOP滑板与Shellcode原理,解决了文件权限、地址随机化等实操问题。深入理解栈溢出漏洞成因与利用思路,提升了二进制逆向分析和漏洞攻击的实操能力。

posted @ 2026-05-25 22:40  周伟诚  阅读(15)  评论(0)    收藏  举报