logo资料库

Perl语言快速入门教程.doc

第1页 / 共24页
第2页 / 共24页
第3页 / 共24页
第4页 / 共24页
第5页 / 共24页
第6页 / 共24页
第7页 / 共24页
第8页 / 共24页
资料共24页,剩余部分请下载后查看
Perl 黑客编程 作者:riusksk(泉哥) 主页:http://riusksk.blogbus.com 邮箱:riusksk@qq.com 目录 一.Perl 简介 二.Windows 下的 Perl 环境搭建 三.基础知识 四.数组 五.条件与循环语句 六.用户数据获取 七.文件读写 八.子程序 九.LWP 模块 十.套接字 Socket 十一.编写攻击代码 (1) XSS exploit (2) SQL Injection Exploit (3) 远程文件包含 (4) LFI2RCE Exploit (5) 本地溢出 (6) 远程溢出 十二.结论 一.Perl 简介 Perl 是 Practical Extraction and Report Language 的编写,它是由 Larry Wall 设计的,主要用于 UNIX 环境下编程,当然目前它也是只支持 Windows 系统的,本文主要也是讲在 Windows 下 的 Perl 编程,并侧重于黑客安全方面。Perl 如脚本语言一般,无需经编译器来编译才能运行 代码,应用起来也很简便,特别是用它来写 exploit 尤为流行。据统计,目前世界上有 70%的 exploit 是用 Perl 来编写的。在国内,由安全焦点出版的《网络渗透技术》一书提到的主要编 程语言中,主要有 perl,c,asm 三种,书中提到在阅读此书的预备知识中就要求熟悉 C,Perl,Asm, 由此可见,perl 语言在国内安全方面的应用也是占有一席之地的。在国外著名漏洞公布站点 milw0rm 中,我们也可以经常看到用 perl 编写的 exploit,无论是在脚本攻击中,还是在系统 漏利用中,特别是在溢出攻击中,都可以经常见到它的身影。除此之外,有些安全人士也用 它来编写 Fuzzing 工具,用于挖掘漏洞。另外,本文讲述的只是 Perl 语言中的冰山一角,如果 读者想深入学习该语言的话,建议学习一下官方文档或者其它编程书籍。 二.Windows 下的 Perl 环境搭建 在开始 Perl 编程之旅之前,读者需要先下载两样工具:ActivePerl 和 EditPlus。ActivePerl 是一
example.pl 款 Perl 解释器,可在 AIX, HP-UX, Linux, Mac OS X, Solaris 和 Windows 等多操作系统平台下 使用,使用起来也很简便,直接双击编写好的*.pl 文件(perl 的文件格式)(这种方法可能会 在未看清楚输出结果就自动关闭了,但如果你只是为了生成某个文件,就可以直接使用这种 方法,比如在本地溢出利用中用于构造可触发溢出的文件)或者在 DOS 下输入如下命令即可: perl EditPlus 是 Windows 下的一个简便的 Internet 32 位文本编辑器、HTML 编辑器和程序设计员的 编辑器,支持 HTML、CSS、PHP、ASP、Perl、C/C++、Java、JavaScript 和 VBScript 等多种 语言的代码高亮显示,使用者也可根据自己需要到其官方网站下载语言包去支持其它语言(如 汇编语言)的代码高亮,读者可也根据自己喜好选择其它编辑器,如 Notepad++。现在我们可 新建一个 example.pl: print "Hello World !\n"; 然后打开 DOS 进入 example.pl 文件所在目录,输入命令:perl 所示: d:\>perl example.pl Hello World! example.pl 后,执行结果如下 三.基础知识 在 Perl 中,变量的定义是在变量名之前加上符号'$',完成后记得加分号';'例如: $x = 123;(十进制数,注意分号的使用,这跟 C 语言是相同的。) $y = 0xff;(十六进制数) $z = -32.2;(浮点数) $string = “ I’m riusksk.\n”;(对于包含空格的字符串要加双引号,是英文输入法中的双引号,而 非中文的双引号。如果无空格,那么不加引号也是可以的。除此之外,单引号也是可以的, 除非字符串中已经含有单引号,就像这一句就只能使用双引号了,但是使用单引号后,不能 解释转义符,也就是说,如果使用了单引号,那么它就会把\n 之类的转义符直接输出,而不 是换行。) 一些常见的转义符如下: New Line Return Tab Form Feed Backspace Vertical Tab Escape Alarm Lowercase All Lowercase Next Uppercase All Uppercase First \n \r \t \f \b \v \e \a \L \l \U \u 在 perl 中,"#"是不为解释器所解释的,它是作为注释符来使用的,比如将以下代码保存为 riusksk.pl 文件: $name = “riusksk \n”; #my name print $name;
那么运行后它会直接输出: d:\>perl riusksk.pl riusksk 现在我们将上面的代码改成: $hello = “Hello,”; $name = “riusksk!\n”; #my name print “$hello”.”$name”; 输出结果如下: d:\>perl riusksk.pl Hello,riusksk! 在这里点号“.”起到一个连接字符串的作用,在后面关于溢出 exploit 编写中,你就可以体会 到它的方便之处了,而且增强了代码的易读性。接下来,我们讲讲关于操作符方面的知识。 算术操作符主要有: + ( 加 ) 、 - ( 减 ) 、 * ( 乘 ) 、 / ( 除 ) 、 * * ( 乘 幂 ) 、 % ( 取 余 ) 、 - ( 单 目 负 ) 。 整数比较操作符主要有: < (小于)、> (大于)、==(等于)、<= (小于等于)、>= (大于等于)、!= (不等于)、<=> (比较,返 回 1,0,或者-1)。 字符串比较操作符主要有: lt (小于)、gt (大于)、eq(等于)、le (小于等于)、ge (大于等于)、ne (不等于)、cmp (比较,返回 1,0,或者-1)。 下面我们实例操作一下,以巩固知识。 输入以下代码并保存为 riusksk.pl: $a = 1+2; $b = 4-3; $c = 5*6; $d = 6/2; $e = 2>1; $f = 3!=4; $g = “A” eq “A”; $h = “A” cmp ”B”; print “$a”.”\t”; print “$b”.”\t”; print “$c”.”\t”; print “$d”.”\t”; print “$e”.”\t”; print “$f”.”\t”; print “$g”.”\t”; print “$h”.”\n”; 输出结果如下: d:\>perl riusksk.pl 3 30 -1 3 1 1 1 1 四.数组
数组是用来存储列表的,与变量不同,它允许在 perl 程序中使用一序列值,可以为任意数值, 也可为空,数组变量是以字符“@”开头的。为了理解它,我们需要去实践操作一下。先在 riusksk.pl 中输入以下代码: @hello = (‘Hello’,’World’); print @hello; 运行后输出结果如下: d:\>perl riusksk.pl HelloWorld 在这里,我们可借助 join()函数在 HelloWorld 之间加入空格,具体代码如下: @hello = (‘Hello’,’World’); print join(‘ ‘,@hello); 运行结果: d:\>perl riusksk.pl Hello World 对于数组元素的读取可以通过下标来实现,首个元素的下标为 0。如果读取的是不存在的元素, 那么它将返回 NULL,但如果给超出数组大小的元素赋值,那么数组就会自动增长,原来没 有的元素为 NULL。比如: @hello = ("hello","world"); print "$hello[0]"."\n"; print "$hello[1]"."\n"; print "$hello[2]"."\n"; 输出结果: d:\>perl riusksk.pl hello world d:\> 下面我们再讲一个函数——split()函数,主要功能是以某种字符来分割句子以转存到数组中, 然后从数组中提取数据以作为他用。下面我们还是以实例进行讲解: $sentence = "Hello everyone ! my name is riusksk. "; @words = split(" ", $sentence) ; print join(" ",@words); 输出结果: d:\>perl riusksk.pl Hello everyone ! my name is riusksk. #这里" "也可写成/ /(中间有空格),即以空格为间隔符 五.条件与循环语句 1. 条件判断语句 经典的条件判断语句莫过于 if—then 语句了,它几乎存在于每一种编程语言中,它在 perl 中基 本格式如下: if (express1) { statement1 }
elsif (express2){ statement2 } else { statement3 } 例如: $name = riusksk; if ($name eq "riusksk") { print "you're riusksk.\n"; } elsif ($name eq "quange") { print "you're quange.\n"; } else { print "I don't know your name !\n"; } 输出结果为: d:\>perl riusksk.pl you’re riusksk. 2.循环语句 对于循环语句,我们这里主要下面四种循环语句:while 循环,until 循环,for 循环,foreach 循环。 (1) while 循环语句 格式: while (express){ statemet } 例如: $x = 1; while ($x < 5) { $x++; } print $x; 输出结果为: d:\>perl riusksk.pl 5 (2)until 循环语句 格式: until (express){ statemet } 例如:
$y = A; until ($y ge C) { $y++; } print $y; 输出结果: d:\>perl riusksk.pl C (3)for 循环语句 格式: for ($i=1; $i <=5; $i++){ statement } 例如: for ($i=1; $i <=5; $i++){ print “$i”.”\t”; } 输出结果: d:\>perl riusksk.pl 1 (4)foreach 循环 格式: foreach $num (@array) { 2 5 3 4 #num 为数组@array 中的元素 statement } 例如: @array = (10,20,30,40,50); foreach $num (@array){ if ($num == 10){ $num = 30; } } print join(" ","@array"); 输出结果: d:\>perl riusksk.pl 30 20 30 40 50 六.用户数据获取 (1)STDIN 当编写 exploit 的时候,我们有时需要获取用户的输入数据,比如 IP 地址,以便使程序根据用 户的意图来执行相应的工作。对于这种情况,我们可以使用 STDIN(标准输入)方法来获取 用户的输入数据。例如: print "What's your name?\n";
#去除换行符,因为输入数据通过 STDIN 获取后会自动添加换行符\n $name = ; chomp $name; print "Hello,$name.Nice to meet you !\n"; 输出结果: d:\>perl riusksk.pl What’s your name? riusksk Hello,riusksk.Nice to meet you ! (2)@ARGV 除以上方法之外,我们还可以使用@ARGV。如同数组一般,@ARGV 支持用户参数,这跟 C 语言中的 argv,argc 类似,在很多 perl exploit 中经常可以见到它。比如我们在对目标主机进行 溢出攻击时,经常可见到像下面的指令: perl 127.0.0.1 是目标主机的 IP 地址,3424 是端口号。下面我们举例讲解一下@ARGV 的使用,以下 代码将输入参数保存在@ARGV 数组中,而$0 是用来代替被 perl 解释器所解释 的文件名(比如 perl riusksk.pl 中$0=riusksk.pl): if (@ARGV != 2) { exploit .pl 127.0.0.1 3424 print “Usage: perl $0 \n”; exit; } ($IP , $Port) = @ARGV; print “IP Address: $IP, Port is $Port.\n”; 输出结果: d:\>perl riusksk.pl Usage: perl riusksk.pl d:\>perl riusksk.pl 127.0.0.1 1234 IP Address:127.0.0.1,Port is 1234. (3)GetOpt 这里我们再讲述另一种获取用户输入数据的方法,这是一种叫做 GetOpt 的 perl 模块。请看下 列代码: use Getopt::Std; getopts (":a:p:", \%args); if (defined $args{a}) { #导入 GetOpt STD 模块,取消模块用 no 语句 #定义两个标志-a 和 -p 分别用来获取参数 #若已给标志-a 中的参数赋值,则将参数值赋予变量$a $a = $args{a}; } if (defined $args{p}) { $p = $args{p}; } if (!defined $args{a} or !defined $args{p}){ #如果有一个参数未输入则输出以下语句并退出 print "Usage: perl $0 -a -p \n"; exit; }
print "IP Address: $a, Port is $p.\n"; 输出结果: d:\>perl riusksk.pl Usage: perl riusksk.pl -a -p d:\>perl riusksk.pl –a 127.0.0.1 –p 1234 IP Address: 127.0.0.1, Port is 1234. 以上三种方法以最后一种最为常用了,常用于编写 exploit。 七.文件读写 在编写本地溢出 exploit 时经常要构造一个可触发溢出的文件,这里就需要对文件进行读写了。 要对某文件进行操作需要先打开文件,打开文件的语法如下: open (fp,” filename”),其中 fp 为文件句柄,可以理解为文件的代号,filename 是文件名,其路 径可为相对路径,也可为绝对路径。例如: open(fp,”exploit.mp3”); open(fp,”c:/hacking/exploit.mp3); 如果我们想创建一个不存在的文件可以使用下列语句: open (fp,”>>exploit.mp3”); 如果打开失败,我们可以结束程序,那么以上代码可更改为: unless (open(fp,”exploit.mp3”)) { die (“open file fail\n”); } 成功打开文件之后,我们就可以对其进行读写了。读取文件的语法为: (1)$line=:从文件中读取一行数据并将其储存到变量$line 中,而且文件指针会向后移动 一行。 (2)@array=:读取文件的所有内容并将其储存到数组@array 中,而且文件中的每一行(包 含回车符)为@array 中的一个元素。 写文件的语句如下: print(fp,”hello\n”); 对文件操作完成后,需要关闭文件: close (fp); 下面我们举个例子来进行文件读写操作: if (open(fp1,">>exploit.txt")) { print ("create file sucessful!\n"); } else { die("create file fail !\n"); } print fp1 ("riusksk\n"."quange\n"); close (fp1); unless (open(fp2,"exploit.txt")) { die ("open file fail\n"); }
分享到:
收藏