NASL脚本语言教程

2.NASL基础:语法

  在语法上,NASL非常类似于C,只是去掉了一些烦人的东西。你勿需顾及对象的类型,也不用为它们分配和释放内存;在使用变量之前不必事先声明。这样,你就可以只致力于安全测试插件的的编写。

  如果你以前不懂C语言,读这个教程可能要费点劲,如果你对C语言已经很精通,读本教程将非常轻松。

2.1.注释

  在NASL中,注释符是#。它只对当前行有效,例如:

  有效的注释:

a = 1 ; #let a = 1
#set b to 2
b = 2;

  无效的注释:

#
set a to 1
#
a = 1;

a = # set a to 1 # 1;

  2.2.变量、变量类型、内存分配和包含(include)

  与C语言不同,在使用变量之前,你不用事先声明,也不用关心它们的类型。如果你的操作错误(例如:把一个IP报文和一个整数相加),NASL就会提醒你。你也不必关心C语言中经常遇到的内存分配和包含(include)等问题,在NASL中没有include,而且内存是在需要时自动分配。

2.3.数字和字符串

  NASL中的数字可以使用三种进制:十进制、十六进制和二进制。例如:

a = 1204;
b = 0x0A;
c = 0b001010110110;
d = 123 + 0xFF;

  数组必须使用引号。注意:和C语言不同,除非使用string()函数,否则NASL解释器将不解释特殊字符(例如: )。例如:

a = 'Hello I'm Renaud'; #a等于Hello I'm Renaud',没有特殊含义
a = string('Hello I'm Renaud');#b等于'Hello
# I'm Renaud'
c = string(a); #c等于b

  string()函数将在“字符串处理”中详细讨论。

2.4.匿名/非匿名参数

    • 非匿名函数(Non-anonymous Function)

  NASL对函数参数的处理方式也C语言也不相同。在C语言中,程序员必须只参数的位置。如果一个函数的参数超过10个,就非常让人头疼。例如,一个构造IP报文的函数就可能有很多参数。如果你需要使用这个函数,就得记住参数的确切次序,这非常浪费时间。在NASL中尽量避免出现这种情况。

  在NASL中,当函数的参数次序比较重要,并且当这个函数不同的参数是不同的类型,这个函数就是一个非匿名函数。也就是,你必须给出元素名。如果你忘记了某些元素,在运行时NASL会给你错误提示。例如:

  forge_ip_packet()函数有很多参数。以下两种调用方式都有效并且执行相同的操作:

forge_ip_packet(ip_hl:5,ip_v:4,ip_p:IPPROTO_TCP);

forge_in_packet(ip_p:IPPROTO_TCP,ip_v:4,ip_hl:5);

  在运行时,用户会被提示缺少参数(ip_len等)。

    • 匿名函数(Anonymous function)

  如果函数只有一个参数,或者所有参数的类型是相同的,这种函数就叫做匿名函数。例如:

send_packet(my_packet);

send_packet(packet1,packet2,packet3);

  这些函数可以有选项。例如:在使用send_packet()函数时,你可以决定是否等待回应。如果你感觉没有必要接收目标的回应,你可以使用如下调用形式来加速安全测试速度:

send_packet(packet,use_pcap:FALSE);

2.5.for和while

202.108.66.229在NASL中也存在for和while两种循环控制,和C语言的几乎完全相同,其语法格式如下:

for(instruct_start;condition;end_loop_instruction)
{
#
#需要执行的代码
#
}

  或者

for(instruction_start;condition;end_loop_instruction)fuction();

  While的格式:

while(condition)
{
#
#执行的代码
#
}

  或者:

while(condition)function();

  例如:

# 显示从1到0
for(i=1;i<=10;i=i+1)display('i : ',i,' ');

# 显示从1到9以及它们是奇数还是偶数
for(j=1;j<=10;j=j+1){
if(j&1)display(j,' is odd ');
else display(j,' is even ');
}
# 使用while
i = 0;
while(i<10)
{
i=i+1;
}

2.6.用户定义的函数

  NASL允许用户定义自己的函数。用户可以使用如下的语法定义自己的函数:

function my_func(argument1,argment2,....)

  用户定义的函数必须使用非匿名(non-anonymous)参数,NASL能够处理递归调用。例如:

function fact()
{
if((n==0)||(n==1))
return(n);
else
return(n*fact(n:n-1));
}

display('b! is ',fact(n:5),' );

  另外,用户自己定义的函数不能调用其它的用户定义函数(实际上是可以的但是遇到这种情况,NASL解释器会向你发出警告)。

  注意:如果你需要让自己的函数返回一个值,需要使用return()函数。因为return()是一个函数,因此需要有括号,下面这种写法就是错误的:

function func()
{
return 1; #这种写法在C语言中是可以的,但是在NASL中不性
}

2.7.操作符

  一些标准的C语言操作符也可以用于NASL,包括:+、-、*、/和%。目前,NASL还不支持操作符的优先级,但是以后版本将会支持操作符的优先级。另外,NASL也支持C语言的二进制操作符|和&。

  除此之外,NASL还有两个独有的操作符:

  • x操作符

  对于某些简单的循环使用for或者while非常不便,而且每次循环还需要对条件进行检查,造成效率的下降。因此NASL引入了一个x操作符来简化某些循环代码。例如:如果你需要发出10次UDP报文,使用x操作符,只要下面一行代码就可以了:

  send_packet(udp)x10;

  • ><操作符

  ><操作符是一个布尔型操作符,表示如果一个字符串A包含在另一个字符串B中,就返回真,例如:

a = 'Nessus''
b = 'I like Nessus';

if(a><B){
#结果为真
display(a ' is contained in ',b,' ');
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值