构建ROP链实现远程栈溢出

通常情况下栈溢出可能造成的后果有两种,一类是本地提权另一类则是远程执行任意命令,通常C/C++并没有提供智能化检查用户输入是否合法的功能,同时程序编写人员在编写代码时也很难始终检查栈是否会发生溢出,这就给恶意代码的溢出提供了的条件,利用溢出,攻击者可以控制程序的执行流,从而控制程序的执行过程并实施恶意行为,而微软的DEP保护机制则可使缓冲区溢出失效,不过利用ROP反导技术依然是可被绕过的,接下来将具体分析如何利用ROP技术绕过DEP保护机制。

课件下载地址:https://pan.baidu.com/s/1WwKp2GTVaCEQOLPUM49dUw 提取码:nk9h

缓冲区溢出的常用攻击方法是将恶意 shellcode 注入到远程服务的堆栈中,并利用 jmp esp 等跳板指令跳转到堆栈中执行恶意的代码片段,从而拿到目标主机的控制权。为了演示攻击的具体手法以及二进制漏洞挖掘的思路,这里作者编写了远程服务程序FTP Server该服务运行后会在本机开启 0.0.0.0:9999 端口,你可以通过nc命令远程连接到服务器并可以执行一些命令.

如上图就是运行后的FTP服务器,通过nc工具链接服务端的地址nc 192.168.1.8 9999 可以得到一个FTP交互环境,此时可以执行send | hello world命令,来向服务器发送一段字符串,同时服务器会返回给你Data received successfully这样的提示信息,好了我们开始分析程序并挖掘漏洞吧。

模糊测试与分析

要执行模糊测试的第一步就是要确定发送数据包中包头的格式,这里我们可以使用Wireshark工具监控TCP流,将源地址设置为192.168.1.2,目标地址设置为 192.168.1.8,监控并从中得到数据传输的格式信息,过滤语句 tcp.stream and ip.src_host==192.168.1.2 and ip.dst_host==192.168.1.8 该语句可以精确的过滤出我们所需要的数据。

上图中我们可以直观的看出,数据包的格式仅仅是 send | hello lyshark 并没有添加任何的特殊符号,更没有加密传输,接下来就是要验证send函数是否存在缓冲区溢出了,这里我们需要编写一个模糊测试脚本来对目标服务进行测试,脚本内容如下,Python 脚本执行后会对目标FTP服务进行发包测试。

# coding:utf-8
import socket,time

def initCount(count,Inc):
    buffer = ["A"]
    while len(buffer)<=50:
        buffer.append("A" * count)
        count = count + Inc
    return buffer

def Fuzz(addr,port,buffer):
    try:
        for string in buffer:
            sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            connect = sock.connect((addr,port))
            sock.recv(1024)
            command = b'send |/.:/' + string.encode()
            sock.send(command)
            sock.close()
            time.sleep(1)
            print('Fuzzing Pass with {} bytes'.format(len(string)))
    except Exception:
        print('\n This buffer cannot exceed the maximum {} bytes'.format(len(string)))

if __name__ == "__main__":
    # initCount 10 说明从0开始递增,每次递增100
    buff = initCount(0,100)
    Fuzz("192.168.1.8",9999,buff)

上方的代码的构造需要具体分析数据包的形式得到,在漏洞模糊测试中上方代码中间部分的交互需要根据不同程序的交互方式进行修改与调整,这里测试脚本执行后当缓冲区填充为2200bytes时程序崩溃了,说明该程序的send函数确实存在缓冲区溢出漏洞,其次该程序缓冲区的大小应在2200字节以内。

经过模糊测试我们可知该函数确实存在漏洞,为了能让读者更加深入的理解缓冲区发生的原因和定位技巧,我将具体分析一下其汇编代码的组织形式,这里为了方便演示我将在攻击主机进行逆向分析。

首先打开X64dbg将FTP程序载入并运行,接着我们需要使用Netcat链接本机 nc 192.168.1.2 9999 并进入一个可交互的shell环境中,然后输入待发送的字符串不要回车。

接着我们回到X64DBG按下ctrl + G在recv函数上下一个断点,因为程序接收用户输入的功能需要使用recv函数的,所以这里我们直接下断,然后运行程序,发送数据后会被断下,我们直接回到程序领空,会看到以下代码片段,这里我们需要在 0040148D 这个内存地址处下一个F2断点,然后取消系统领空中recv上的断点。

通过再次发送send | hello lyshark程序会被断下,我们单步向下跟进会发现下面的代码片段,这里正是我们的send函数所执行的区域,此处我们记下这个内存地址 004017D5 然后关闭X64dbg

打开IDA Pro加载程序并按下G键,我们来到刚刚的内存地址处,这里已经给大家分析好了,关键的变量是分配了3000个字节的缓冲区,直接传递给了_Function3函数。

接着我们继续跟进这个call _Function3函数,会发现子过程内部并没有对接收缓冲区大小进行严格的过滤,强制将3000byte的数据拷贝到2024byte的缓冲区中,此时缓冲区就会发生溢出,从而导致堆栈失衡,程序崩溃,这和上方的模糊测试脚本得到的结果是差不多的。

为了能够更加精确的计算出缓冲区的具体大小,我们还需

控制EIP寄存器

构建漏洞利用代码

ROP技术绕过DEP保护

ASLR 如何绕过解析

将脚本集成到Metasploit

原创作品,转载请注明出处!i

原文地址:https://www.cnblogs.com/LyShark/p/12340479.html

时间: 2024-10-13 09:44:32

构建ROP链实现远程栈溢出的相关文章

构建ROP链-绕过 DEP 保护

在缓冲区溢出与攻防博弈中总结了攻防博弈的过程,而最让黑客们头疼的莫过于DEP保护了,DEP 数据执行保护,其基本原理是将数据所在内存页标识为不可执行,如果程序尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意代码,针对这样的保护措施同样也有突破的方式,本次实验将通过使用ROP技术,并配合 virtualprotect() 函数来突破DEP保护的限制. 理解 ROP 返回导向编程 通过 ROP 运行ShellCode 原文地址:https://www.cnblogs.com/LyS

Vivotek 摄像头远程栈溢出漏洞分析及利用

Vivotek 摄像头远程栈溢出漏洞分析及利用 近日,Vivotek 旗下多款摄像头被曝出远程未授权栈溢出漏洞,攻击者发送特定数据可导致摄像头进程崩溃. 漏洞作者@bashis 放出了可造成摄像头 Crash 的 PoC :https://www.seebug.org/vuldb/ssvid-96866 该漏洞在 Vivotek 的摄像头中广泛存在,按照官方的安全公告,会影响以下版本 CC8160 CC8370-HV CC8371-HV CD8371-HNTV CD8371-HNVF2 FD81

001/Go语言构建区块链(mooc)

1.区块链发展与现状 视频地址:https://www.imooc.com/video/17452 注意: 比特币与以太坊最大的区别在于: 以太坊引入了对图灵完美智能合约的支持,人们可以将任何业务逻辑以合约的形式写入区块链,在以太坊前,发行自己的数字货币,就需要搭建一个独立的区块链网络. 比较稳定,被拿来研究的区块链系统: [1].超级账本 本身不是一个完整的区块链系统,而是方便企业搭建自己的区块链框架.各个组件,如数据存储,共识算法等,都可以灵活替换与组装.对智能合约也有很好的支持. 因此常被

基于Go语言构建区块链:part1

Golang语言和区块链理论学习完毕后,快速入门方法无疑是项目实战.本文将参考https://jeiwan.cc/tags/blockchain/教程,学习如何基于Go语言构建区块链. 1.编程环境设置 编程工具使用GoLand,前文已介绍软件安装经验.软件安装完成后,还需要设置工作路径"GOPATH".在电脑上新建一个空白目录,然后点击点击Goland菜单按钮:"File"->"Settings"->"GO"-&

基于Java语言构建区块链(一)—— 基本原型

引言 区块链技术是一项比人工智能更具革命性的技术,人工智能只是提高了人类的生产力,而区块链则将改变人类社会的生产关系,它将会颠覆我们人类社会现有的协作方式.了解和掌握区块链相关知识和技术,是我们每位开发人员必须要去做的事情,这样我们才能把握住这波时代趋势的红利. 本文将基于Java语言构建简化版的blockchain,来实现数字货币. 创建区块区块链是由包含交易信息的区块从后向前有序链接起来的数据结构.区块被从后向前有序地链接在这个链条里,每个区块都指向前一个区块.以比特币为例,每个区块主要包含

.Net Core 商城微服务项目系列(十):使用SkyWalking构建调用链监控(2019-02-13 13:25)

SkyWalking的安装和简单使用已经在前面一篇介绍过了,本篇我们将在商城中添加SkyWalking构建调用链监控. 顺带一下怎么把ES设置为Windows服务,cd到ES的bin文件夹,运行elasticsearch-service.bat install. 首先我们需要在每个服务里通过NuGet引用SkyAPM.Agent.AspNetCore,完成之后我们添加配置文件skyapm.json,可以通过SkyWalking的脚本命令自动生成,也可以手动新建,这里贴一下: { "SkyWalk

为什么要使用智能合约来构建区块链应用程序?

为什么要使用智能合约来构建区块链应用程序? 人们需要了解为什么以及何时使用智能合约来开发区块链应用程序. 区块链技术最关键的特征之一就是它的去中心化性质.这意味着其信息由网络的所有各方共享.因此,它消除了中间人或中间机构来促进运营的需要.此功能特别有用,因为它可以避免黑客和欺诈活动的可能性.区块链技术提供了功能丰富.快速.廉价和高效的交易模式.因此,政府和银行部门中的大多数组织已开始采用这种一流的技术. 以下将探讨智能合约在市场上创建区块链应用的重要性和需求. 什么是智能合约? 智能合约是一种计

Cat 客户端如何构建调用链消息树

场景 & 代码 Inner0 中的某方法调用了 Inner1,代码 Inner1的代码很简单, Cat通过一个线程本地变量来保存调用链的相关信息,其中核心的数据结构是消息树和操作栈.消息树用来存数据,操作栈用来构建节点的层次关系. 在上面的调用过程中,这两个数据结构状态的变化如下 更复杂的场景 数据的变化过程

在Linux服务器、客户端中构建密钥对验证进行远程连接

构建密钥对验证SSH体系的基本过程包括四步: SSH客户端:192.168.1.1SSH服务器:192.168.1.2 1.在客户端创建密钥对: [[email protected] /]# ssh-keygen -t ecdsa # " -t " 用来指定加密算法,这里使用ecdsa,还有一个是dsa. Generating public/private ecdsa key pair. Enter file in which to save the key (/root/.ssh/i