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

猜你喜欢

转载自blog.csdn.net/u012999810/article/details/71423900
今日推荐