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

news/2024/10/11 17:07:09

1.实验内容

本周课程内容为缓冲区溢出和shellcode:

2.实验过程

(1)直接修改程序机器指令,改变程序执行流程
①首先根据网上教程安装好kali虚拟机,更改主机名为heshan;下载目标文件pwn1,将pwn1文件放入共享文件夹并在VMware中设置共享以便使用,并将其重命名为pwn20222418。

②然后运行可执行文件./pwn20222418,再对文件进行反汇编找到

三个函数,此时call指令跳转到foo函数:

③修改可执行文件pwn20222418,将其中的call指令的目标地址由d7ffffff变为c3ffffff:
终端输入vi pwn20222418 ,打开文件后为乱码,输入:%!xxd将显示模式切换为16进制模式,然后查找修改内容/e8 d7并修改d7为c3。

(查找修改内容/e8 d7)

(修改完成,转换16进制为原格式)
④再对文件进行反汇编,此时call指令跳转到getShell函数:

运行下改后的代码,会得到shell提示符#:

(2)通过构造输入参数,造成BOF攻击,改变程序执行流
首先根据提示安装gdb,使用sudo apt update和sudo apt install gdb命令安装gdb。
①反汇编,了解程序的基本功能:

在程序调用时,会读入字符串,但系统只预留了28字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址。根据反汇编结果,程序正常执行时,call指令会调用foo函数,并在堆栈中压入返回地址0x80484ba。
②确认输入字符串哪几个字符会覆盖到返回地址:

如果输入字符串111111111111111111111111111234567890123,那 3456 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给pwn20222418,就会运行getShell。
③确认用什么值来覆盖返回地址:
1234替换为getShell的地址0x0804847d,根据字节序,需要输入11111111222222223333333344444444\x7d\x84\x04\x08。
④构造输入字符串
由为我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件,使用16进制查看指令xxd查看input文件的内容是否如预期。

然后将input的输入,通过管道符“|”,作为pwn1的输入,成功调用shellcode。

(3)注入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
②准备工作:修改设置
这一步需要安装execstack,使用sudo apt-get upgrade命令无法安装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命令进行解压。

安装好后开始修改设置:

③构造要输入的payload
构造shellcode的输入,并注入这段攻击buf;其中x1x2x3x4是占位符,后续将替换为注入shellcode的地址,即foo函数中返回地址的位置,这个地址需要我们接下来通过gdb分析找到。

再开另外一个终端,用gdb来调试这个进程。
首先找到pwn的进程号是3869。

启动gdb调试这个进程:

通过设置断点,来查看注入buf的内存地址,找到01020304,就是返回地址的位置。shellcode就挨着,所以地址是 0xffdc3040

重新构造shellcode的输入并验证:

尝试调用shellcode:

本来应该成功结束了,可恶!!!
但很遗憾,失败了,此后我重新尝试了几次,都在最后这一步出现同样的错误,我不信邪拿室友的电脑重做了一次,居然一下就成功了!(以下是成功截图)




截止写报告我还没改成功自己电脑的实验,眼看快提交了才用了室友的电脑尝试[对手指],我想之后再继续看看是哪里的问题。

3.问题及解决方案

  • 问题1:共享文件夹在虚拟机再次启动时共享失败
  • 问题1解决方案:查找资料发现如果选择一直启用共享文件夹,再次开启虚拟机时需要再次挂载,也可以选择每次开机时重新共享
  • 问题2:找不到execstack命令
  • 问题2解决方案:上网搜索发现需要下载,且需要到外部官网下载放入文件夹,你是在Windows主机下载压缩包后,通过共享文件夹用虚拟机解压安装。
  • 问题3:最后调用shellcode失败报错
  • 问题3解决方案:换了个虚拟机从头开始做,成功了;正在根据报错查找资料尝试解决。

4.学习感悟、思考等

实验开始之前,我对实验内容和任务可以说是一点也不明白,刚开始做的过程中也是只能按照实验指导的步骤一步步来,但不出所料这样单纯的模仿出了不少问题,比如多按了enter不会共享文件看不懂报错等。在这个过程中我不断和同学交流、查找资料并对比一些网络上的信息,不断尝试才最终完成实验,在这之后我对本次缓冲区溢出实验的原理和三种方法的过程有了理解和吸收,给其他人讲的时候也能说出一二,这既让我觉得神奇有趣也让我有了一些成就感和继续学习的更多动力。

参考资料

(主要参考资料)
https://blog.csdn.net/qq_24484317/article/details/129532811?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522B570DD9E-72CE-43F5-AE66-55C3BA54673A%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=B570DD9E-72CE-43F5-AE66-55C3BA54673A&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-129532811-null-null.142v100pc_search_result_base6&utm_term=kali%20linux%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B&spm=1018.2226.3001.4187
https://blog.csdn.net/Libra1313/article/details/135628331
https://zhuanlan.zhihu.com/p/111035992
https://gitee.com/wildlinux/NetSec/blob/master/ExpGuides/0x11_MAL_逆向与Bof基础.md#4-注入shellcode并执行
https://blog.csdn.net/zonei123/article/details/105500483

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

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

相关文章

mysqldump文件中有SET @@SESSION.SQL_LOG_BIN= 0;解决方法

mysqldump文件中有SET @@SESSION.SQL_LOG_BIN= 0mysqldump -uroot -pmypassword --all-databases>test.sql more test.sql -- MySQL dump 10.13 Distrib 5.7.21, for linux-glibc2.12 (x86_64) -- -- Host: localhost Database: -- ----------------------------------…

获取字符串的在html页面上的宽度并且若文字过长则缩小字体填充

某个页面有这样一个需求:一个固定宽度的div,若文字过长,则缩小字体填充。 看到同事采用的是用php的GD库的imagettfbbox函数来计算文字的宽度。 imagettfbbox(float $size,float $angle,string $font_filename,string $string,array $options = []): array|false取得使用 Tru…

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

1.实验内容 本周学习内容1.熟练掌握了栈和堆的概念。 2.掌握了Linux的基本操作,如shell命令和编译器gcc、调试器gdb的使用。 3.掌握了缓冲区溢出的原理。实验任务 本次实验的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任…

github加速

Github一般用于Git的远程仓库,由于服务器位于国外,国内访问速度比较慢,为了提高访问速度,绕过DNS域名解析。 获取Github的IP地址按下ctrl+alt+T打开命令终端,输入: nslookup github.com 获取github.global.ssl.fastly.net的IP地址按下ctrl+alt+T打开命令终端,输入:…

Small Permutation Problem (Easy Version)

算法 考虑转化 每个点 \(p_i\) 在一个平面直角坐标系中表示为点 \((i, p_i)\) 于是转化为一个棋盘问题, 即每一个点不能在 同一行 / 同一列 \(a\) 数组的限制相当于在左下角为 \((0, 0)\), 右上角为\((i, i)\) 中的正方形中, 有 \(a_i\) 个棋子 于是在每一次加入的时候, 都只能…

Flutter功能性组件(2):弹出框

一、showModalBottomSheet(模态底部弹出框) showModalBottomSheet 用于显示一个模态底部弹出框。 属性解析: Future<T?> showModalBottomSheet<T>({required BuildContext context, // 表示底部弹出框所处的上下文,通常来自当前 widget。required WidgetBuild…

Flutter容器(6):页面骨架(Scaffold)

Material 组件库提供了丰富多样的组件,这里介绍一下最常用的 Scaffold 组件,其余的读者可以自行查看文档或 Flutter Gallery 中 Material 组件部分的示例。注意:Flutter Gallery 是 Flutter 官方提供的 Flutter Demo,源码位于 flutter 源码中的 examples 目录下,笔者强烈建…

Golang上下文context

上篇内容我们主要讲解了net/http标准库的使用,其中包含如何创建POST请求、GET请求以及如何携带参数的请求。 Context介绍 context释义为上下文,在我们使用goroutine时一般使用context来进行元数据的传递,非元数据不建议使用context来进行传递。那么我们主要是用context用来做…