首頁 | 安全文章 | 安全工具 | Exploits | 本站原創 | 關于我們 | 網站地圖 | 安全論壇
  當前位置:主頁>安全文章>文章資料>網絡安全>文章內容
bugscam分析
來源:http://blog.0x557.org/kkqq/ 作者:kkqq 發布時間:2004-02-10  

bugscam分析

kkqq([email protected])

http://www.0x557.org
http://blog.0x557.org/kkqq/

-- [ 目錄

1.簡介
2.檢查的模式
2.1 緩沖區溢出的檢查
2.2 格式化字符串的檢查
3.難點分析
3.1 緩沖區長度的確定
3.2 誤報的情況
4.一些展望
5.參考

-- [ 簡介

bugscam[1]是一個基于IDA Pro idc腳本機制的輕量級的漏洞分析工具。
之所以說他是輕量級的,是因為只能檢查出一些比較簡單的編程錯誤。這里我
們對bugscam實現上的一些機制進行簡單的分析,并對bugscam的局限性做一些
評論。關于bugscam的簡單介紹,可以參考[2]。

這里就不介紹關于IDA Pro和idc腳本機制的背景知識了,這些資料可以參
考[3]一書和IDA Pro的在線幫助[4]。

-- [ 檢查的模式

bugscam采取的是針對可能導致緩沖區溢出和格式化字符串的庫函數進行
檢查的方式來確定程序中是否存在安全隱患。相對于源碼級的安全審核工具
中splint[5]等等來說,是一樣的原理,只不過bugscam是匯編級的檢查,本身
又借助了IDA Pro這個強大的反匯編平臺。

這里簡單的列一下bugscam檢查的模式,相信很多朋友對下邊的模式都已
經了熟于心。

---- [ 緩沖區溢出的檢查

1.最常見的就是如下的兩種模式了
strcpy(dst, src);
strcat(dst, src);

這里bugscam判斷的算法很簡單,如果dst的長度小于src的長度,那么就可
以認為這里有緩沖區溢出的問題。(注意:只是存在緩沖區溢出的問題,并不等同
于這就是一個可以利用的漏洞,如何使用自動化工具判斷漏洞是否可以利用,
這又是另外的一個大問題。)

2.MultiByteToWideChar的檢查,在windows平臺上,最常見的錯誤可能就是
單字節和雙字節的轉化中出的問題了。MultiByteToWideChar就是這樣的例子。

判斷的規則很簡單,如果sizeof(dst) < sizeof(src) * 2那么就被判斷可
能存在緩沖區溢出的問題。

3.還有一種算是比較隱含的錯誤,但是也比較常見的錯誤類型。

sprintf(dst, "%s", src);

其實,這個是等同于strcpy(dst, src),當然有可能sprintf的格式串不是
單純的"%s",有可能是"%s: No such file or directory."之類的:)

判斷的算法也很簡單,sizeof(dst) < sizeof(src)。這里當然會有一點誤
差,bugscam里邊沒有詳細計算格式化串中字符占的長度。而且對%.xs(x表示數
字)之類的判斷也沒有做完。

---- [ 格式化字符串的檢查

這個簡單的不能再簡單了,就是檢查sprintf的第二個參數是靜態字符串還
是動態分配的字符串。可惜這個在release的版本中也是只看到影子,具體也沒
有實現。

從上邊這些簡單的模式來看,bugscam似乎是一個很不照的工具。但是想想
Halvar Flake的初衷就可以理解這些問題。下邊是從bugscam的readme中截取的。

"It's release was inspired by the fact that I had libaudit.idc
(the "core" engine) lying on my harddisk since early 2001, and never
thought someone would bother with something this simple -- but now in
2003 one can find commercial products with almost identical
functionality on the Web, and as such I decided to release this as
OpenSource. "

所以buscam是一個Prove of Concept Code,并不是一個完美的工具。至于
那個商業化的工具是什么呢?在OYXin的大力幫助下,這里八卦一下,可能就是
bugscan[6]。OYXin還真正體驗了一把萬惡的資本家向錢看的冷漠無情。

-- [ 難點分析

其實對普通的程序進行上邊幾種模式的檢查,理論上來說就可以發現不少
問題了(看看ms現在的漏洞,大部分也還是這種低級層次的問題,當然這種問題
會不斷的少下去)。但是用過bugscam的朋友就知道,bugscam輸出的報告中大部
分的信息都是無用的。技術的角度來說,這就是匯遍級模式普遍都存在的一些
問題。

c語言不像Java一樣是一種嚴格的類型語言。c語言中的字符串類型是沒有
長度這個屬性的,除此之外c語言中指針被賦予的靈活性,也是這些難點的根本
所在。針對二進制分析更為困難的是,匯編中根本就沒有類型這個東西,只有
地址和地址內容。

bugscam效率不高的原因主要有兩個,無法精確得到緩沖區長度和誤報。有
點類似于IDS系統中的誤報和漏報。

---- [ 緩沖區長度的確定

bugscam根據緩沖區所在位置的不同,提供了幾個確定緩沖區的長度:

static GetArgBufSize(eaCall, iArgnum);
static StckBuffSize(lpCall, cName);
static StrucBuffSize(strucID, cName);
static SHeapBuffSize(eaBuff);

以上的這些功能其實都基于一個最核心的函數:
static BuffSize(eaInstruc, iOpnum)

(以上函數都在libaudit.idc中)
這些函數其實都沒有什么好分析的,這里簡單起見,我們把確定緩沖
區長度的核心思想說一下。這里以棧中的緩沖區分配為例:

.text:0041C86C sub_41c86c proc near
.text:0041C86C
.text:0041C86C statbuf = byte ptr -1030h
.text:0041C86C var_101E = dword ptr -101Eh
.text:0041C86C var_101A = dword ptr -101Ah
.text:0041C86C dst = byte ptr -1008h
.text:0041C86C var_808 = byte ptr -808h
.text:0041C86C var_8 = dword ptr -8
.text:0041C86C var_4 = dword ptr -4
.text:0041C86C arg_0 = dword ptr 8

可以看到棧中現在有7個區域,分別從var_4,var_8一直到statbuf。
每個棧都有特定的區域。總的棧空間可以從sub esp xxx和add esp xxx指
令中計算得到,而每個區域又是靠在這個函數那通過esp基址加偏移量的引
用得到,比如函數內部有一個

lea eax, [ebp-808h]

形式的指令,那么可以判斷ebp-808就是一個棧分配區域。這樣也就
確定了函數棧空間有一個var_808的變量。分析完函數那所有的這些東西
之后也就確定了函數的棧空間分配(這些是ida自動完成的)。

看到這里,大家也就知道了緩沖區的長度是怎么確定了。比如要確定
dst區域的大小,那么就是1008h - 808h = 1000h長了。原理就這么簡單
其他諸如data段數據確定也是一樣。

bugscam的ReadMe里邊有一句話:

"Inspect manually to remove false positives, use the
ObjRec package (or something similar) to reconstruct
structures & objects in order to further decrease
false postives"

ObjRec就是Halvar Flake利用上述原理寫的一個逆向工程binary中可
能定義的struct的工具,所以兩個搭配,如果緩沖區是結構中的某一個變
量,效果會很不錯。具體的資料可以參考[7]。

---- [ 誤報的情況

仔細想一想就知道上邊這種方法的缺陷。比如我們經常會寫類似如下
形式的代碼:

char *pRequest = "GET / HTTP/1.1"
char *pContext = pRequest + 4;

利用上邊的方法確定緩沖區就會吃虧了。因為pRequest和pRequest + 4
都是一個引用到的地址,這樣判斷出來的緩沖區就會分解成一個長度為4和
長度為strlen("GET / HTTP/1.1") - 4的緩沖區了。所以bugscam生成的報
告里邊出現緩沖區長度為2,3這樣10以內的緩沖區,很大一部分都是誤報。

還有的情況就是無法確定緩沖區的長度,這個具體掃一眼代碼就知道是
什么類型了,例如GetArgBufSize中的代碼:

if(strstr(cOpnd, "[") != -1)
{
return(0);
Message("can deal with \"[\"\n");
}

形如push [eax]這樣的代碼,就沒有辦法搞了。且不說靜態分析沒有運行
時的信息,光是回溯eax的賦值就夠你受的,慢慢就會發現是在逆向工程程序
的算法,這個有源碼都困難,更不要說匯編了:)。(這里說得是工具,不是說
人分析困難,人的力量是無窮的:))

這些是匯編語言上的限制,很難想出什么切實可行的方法。另外還有一些
和api接口相關的限制。比如windows平臺上,字符串有時是作為資源存在的。
而字符串的獲取在程序中是通過LoadString之類的api調用獲得的。在這種情況
下,要確定這種字符串的長度以及內容(比如檢查是否有%s之類的格式串)相對
就很困難,如果要實現的話就是要實現一個對binary中資源文件的解析。幸運
的是這種問題在*nix上相對存在比較少。

-- [ 一些展望

受到目前反匯編技術的局限,bugscam注定了只能有這樣子的功能。但是
我個人覺得這種工具又是不可缺少的,因為確實可以檢查出一些簡單模式的
漏洞。只要能減少體力勞動的工具都是有用的。在具體的分析過程中,先用
bugscam掃描一遍,可以排除不少跟本不可能會有問題的函數調用,幸運的
話,也可以找到漏洞。

bugscam目前的限制在于只是一個原型代碼,可以改進的地方一個是加入
更多的可以匹配的模式,另外一個就是在反匯編技術允許的范圍內完善確定
確定緩沖區大小的算法。很不幸的是Halvar Flake本人對bugscam的完善也
不是很關心,他不是很看好這個東西的前景,他認為靜態分析如果想更有
效的話,需要一個更為強大的逆向工程平臺,現在IDA Pro是遠遠不夠的。
其實想一想SPLINT這種源代碼審查工具都做不到精確度很高,匯編級的東
西就是奢談了。

寫文章的過程中得到OYXin和N.E.V.E.R的支持,在此連同參考中資料的
作者一并表示感謝。

(其實沒什么技術含量,所以里邊加了一些亂七八糟八卦的東西:))

-- [ 參考

[1] BugScam IDC Package
http://sourceforge.net/projects/bugscam

[2] BugScam簡介
http://www.nsfocus.net/index.php?act=sec_tool&do=view&tool_id=389&keyword=

[3] 加密與解密(第二版)
http://www.china-pub.com/computers/common/info.asp?id=12210

[4] DataRescue IDA Pro Disassembler Page : Support and FAQ
http://www.datarescue.com/idabase/idasupport.htm

[5] SPLINT
http://splint.org/

[6] BugScan: Automated Software Security Analysis
http://www.hbgary.com/index.asp?G1=2&G2=1

[7] Auditing Binaries For Security Vulnerabilities
http://www.blackhat.com/html/bh-consulting/bh-consulting-tools.html
http://www.blackhat.com/presentations/win-usa-01/Halvar/bh-win-01-halvar-flake.ppt
$Id: bugscam.txt,v 1.2 2003/12/13 11:00:09 yclin Exp $

Posted by kkqq at February 1, 2004 03:26 AM


 
[推薦] [評論(0條)] [返回頂部] [打印本頁] [關閉窗口]  
匿名評論
評論內容:(不能超過250字,需審核后才會公布,請自覺遵守互聯網相關政策法規。
 §最新評論:
  熱點文章
·一句話木馬
·samcrypt.lib簡介
·教你輕松查看QQ空間加密后的好友
·web sniffer 在線嗅探/online ht
·SPIKE與Peach Fuzzer相關知識
·Cisco PIX525 配置備忘
·用Iptables+Fedora做ADSL 路由器
·檢查 Web 應用安全的幾款開源免
·asp,php,aspx一句話集合
·Md5(base64)加密與解密實戰
·NT下動態切換進程分析筆記
·風險評估中的滲透測試
  相關文章
·Brk漏洞分析和修補
·Linux 安全模塊(LSM)簡介
·黑客掃描特征及十種易受攻擊端口
·蠕蟲病毒傳播模式分析
·如何利用格式化溢出漏洞,x86/sp
·Imail iLDAP溢出分析
·samcrypt.lib簡介
·淺析UNIX系統中Shell的一種新應
·分布式拒絕攻擊(DDOS)軟件tfn2k
·pwdump2 samdump.c淺析與改進
·用IIS建立高安全性Web服務器
·新形式下的網絡防毒建議匯總
  推薦廣告
CopyRight © 2002-2020 VFocuS.Net All Rights Reserved
期本期特码