Bro語法

Bro支持本地和全局兩種變量,本地變量的聲名使用local語句,全局變量的聲明用global。本地變量只可以在函數或者事件的作用域內部來進行聲明,全局變量必須要在事件或者函數的外部進行聲明。不可以在function,hook,event這些處理函數中使用,這一點個不同於我們常用的C語言,這樣的語法設計,可以使數據和處理流程清晰的分隔開。下面列出了一些在Bro中我們常用的數據類型。
數據類型:
數據類型

Bool                      布爾類型
count, int, double        數字類型
time, interval            時間類型
string                    字符串
pattern                   正則表達式
port, addr, subnet        網絡類型
Enum                      枚舉(用戶自定義類型)
table, set, vector, record  容器類型
function, event, hook     可執行類型
File                      文件類型 (only for writing)
opaque                                                                                                                     透明類型 (for some built-in functions)
Any Any                   類型 (for functions or containers)

Bro入侵檢測系統中的安全策略都是使用Bro腳本語言編寫的,我們可以簡要介紹一下Bro語言的基本知識。
Bro中的聲明:

聲明語句             描述
module              改變當前模塊
export              從當前模塊導出定義
global              聲明一個全局變量
const               聲明一個全局常量
Type                聲明一個一用戶自定義類型
redef               重新定義一個全局值或者擴展一個用戶自定義類型
function/event/hook 聲明一個 function/event/hook
local               聲明一個局部變量

Bro語言基本具備我們平時使用的編程語言中的常規數據類型,bool是一個布爾型的變量,它有T和F兩種取值,分別代表真和假。Int是整形變量。Count表示的是非負整數。Double代表的是雙精度浮點型變量。String表示的是字符串,bro中的字符串不是用NULL結束的,而是用count型變量和一個字符矢量表示。因爲NULL在網絡數據中是非常常見,而且容易產生的。一些攻擊行爲就會通過使用NULL來構造攻擊代碼片段從而實施攻擊行爲。

例如我們向FTP服務器發送如下的這一條命令:
USER nice \0 USER root
命令中的\0代表NULL,一些FTP服務器程序會把它們當成兩個分離的命令,如果我們的程序中將NULL當作字符串的結束符的話,就會將上面的命令拆分爲兩條命令來檢測,這樣的話就檢測不到惡意代碼。
除了一些常見的數據類型外,Bro爲了滿足特定的應用,還定義了一些特殊的數據類型。例如Time代表一個絕對時間,interval代表的是時間差,兩個time相減可以得到interval,向一個time增加或減少interval可以得到另外一個time,但是兩個time變量是不可以相加或者相減的;Port變量對應TCP或UDP端口號,TCP和UDP變量具有嚴格的區分。一個port變量既可以代表TCP端口,又可以代表UDP端口。但是同一時間只代表同一種數據類型。Port變量的有兩種類型,一種是“/TCP”或“/UDP”前面跟一個無符號證書,一種是使用getservbyname()函數得到的服務名。“80/TCP”代表的是端口爲80的WWW應用上的http協議。兩種類型的類型具有對應關係,例如:TELNET是一個與“23/TCP”相同的常量;另外,port可以用在表達式中,甚至可以進行比較運算,例如:我們可以將“20/TCP

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章