您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Perl-快速-入门-教程
Perl黑客编程作者:riusksk(泉哥)主页:邮箱:riusksk@qq.com目录一.Perl简介二.Windows下的Perl环境搭建三.基础知识四.数组五.条件与循环语句六.用户数据获取七.文件读写八.子程序九.LWP模块十.套接字Socket十一.编写攻击代码(1)XSSexploit(2)SQLInjectionExploit(3)远程文件包含(4)LFI2RCEExploit(5)本地溢出(6)远程溢出十二.结论一.Perl简介Perl是PracticalExtractionandReportLanguage的编写,它是由LarryWall设计的,主要用于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是一款Perl解释器,可在AIX,HP-UX,Linux,MacOSX,Solaris和Windows等多操作系统平台下使用,使用起来也很简便,直接双击编写好的*.pl文件(perl的文件格式)(这种方法可能会在未看清楚输出结果就自动关闭了,但如果你只是为了生成某个文件,就可以直接使用这种方法,比如在本地溢出利用中用于构造可触发溢出的文件)或者在DOS下输入如下命令即可:perlexample.plEditPlus是Windows下的一个简便的Internet32位文本编辑器、HTML编辑器和程序设计员的编辑器,支持HTML、CSS、PHP、ASP、Perl、C/C++、Java、JavaScript和VBScript等多种语言的代码高亮显示,使用者也可根据自己需要到其官方网站下载语言包去支持其它语言(如汇编语言)的代码高亮,读者可也根据自己喜好选择其它编辑器,如Notepad++。现在我们可新建一个example.pl:printHelloWorld!\n;然后打开DOS进入example.pl文件所在目录,输入命令:perlexample.pl后,执行结果如下所示:d:\perlexample.plHelloWorld!三.基础知识在Perl中,变量的定义是在变量名之前加上符号'$',完成后记得加分号';'例如:$x=123;(十进制数,注意分号的使用,这跟C语言是相同的。)$y=0xff;(十六进制数)$z=-32.2;(浮点数)$string=“I’mriusksk.\n”;(对于包含空格的字符串要加双引号,是英文输入法中的双引号,而非中文的双引号。如果无空格,那么不加引号也是可以的。除此之外,单引号也是可以的,除非字符串中已经含有单引号,就像这一句就只能使用双引号了,但是使用单引号后,不能解释转义符,也就是说,如果使用了单引号,那么它就会把\n之类的转义符直接输出,而不是换行。)一些常见的转义符如下:\nNewLine\rReturn\tTab\fFormFeed\bBackspace\vVerticalTab\eEscape\aAlarm\LLowercaseAll\lLowercaseNext\UUppercaseAll\uUppercaseFirst在perl中,#是不为解释器所解释的,它是作为注释符来使用的,比如将以下代码保存为riusksk.pl文件:$name=“riusksk\n”;#mynameprint$name;那么运行后它会直接输出:d:\perlriusksk.plriusksk现在我们将上面的代码改成:$hello=“Hello,”;$name=“riusksk!\n”;#mynameprint“$hello”.”$name”;输出结果如下:d:\perlriusksk.plHello,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=21;$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:\perlriusksk.pl31303111-1四.数组数组是用来存储列表的,与变量不同,它允许在perl程序中使用一序列值,可以为任意数值,也可为空,数组变量是以字符“@”开头的。为了理解它,我们需要去实践操作一下。先在riusksk.pl中输入以下代码:@hello=(‘Hello’,’World’);print@hello;运行后输出结果如下:d:\perlriusksk.plHelloWorld在这里,我们可借助join()函数在HelloWorld之间加入空格,具体代码如下:@hello=(‘Hello’,’World’);printjoin(‘‘,@hello);运行结果:d:\perlriusksk.plHelloWorld对于数组元素的读取可以通过下标来实现,首个元素的下标为0。如果读取的是不存在的元素,那么它将返回NULL,但如果给超出数组大小的元素赋值,那么数组就会自动增长,原来没有的元素为NULL。比如:@hello=(hello,world);print$hello[0].\n;print$hello[1].\n;print$hello[2].\n;输出结果:d:\perlriusksk.plhelloworldd:\下面我们再讲一个函数——split()函数,主要功能是以某种字符来分割句子以转存到数组中,然后从数组中提取数据以作为他用。下面我们还是以实例进行讲解:$sentence=Helloeveryone!mynameisriusksk.;@words=split(,$sentence);#这里也可写成//(中间有空格),即以空格为间隔符printjoin(,@words);输出结果:d:\perlriusksk.plHelloeveryone!mynameisriusksk.五.条件与循环语句1.条件判断语句经典的条件判断语句莫过于if—then语句了,它几乎存在于每一种编程语言中,它在perl中基本格式如下:if(express1){statement1}elsif(express2){statement2}else{statement3}例如:$name=riusksk;if($nameeqriusksk){printyou'reriusksk.\n;}elsif($nameeqquange){printyou'requange.\n;}else{printIdon'tknowyourname!\n;}输出结果为:d:\perlriusksk.plyou’reriusksk.2.循环语句对于循环语句,我们这里主要下面四种循环语句:while循环,until循环,for循环,foreach循环。(1)while循环语句格式:while(express){statemet}例如:$x=1;while($x5){$x++;}print$x;输出结果为:d:\perlriusksk.pl5(2)until循环语句格式:until(express){statemet}例如:$y=A;until($ygeC){$y++;}print$y;输出结果:d:\perlriusksk.plC(3)for循环语句格式:for($i=1;$i=5;$i++){statement}例如:for($i=1;$i=5;$i++){print“$i”.”\t”;}输出结果:d:\perlriusksk.pl12345(4)foreach循环格式:foreach$num(@array){#num为数组@array中的元素statement}例如:@array=(10,20,30,40,50);foreach$num(@array){if($num==10){$num=30;}}printjoin(,@array);输出结果:d:\perlriusksk.pl3020304050六.用户数据获取(1)STDIN当编写exploit的时候,我们有时需要获取用户的输入数据,比如IP地址,以便使程序根据用户的意图来执行相应的工作。对于这种情况,我们可以使用STDIN(标准输入)方法来获取用户的输入数据。例如:printWhat'syourname?\n;$name=STDIN;chomp$name;#去除换行符,因为输入数据通过STDIN获取后会自动添加换行符\nprintHello,$name.Nicetomeetyou!\n;输出结果:d:\perlriusksk.plWhat’syourname?riuskskHello,riusksk.Nicetomeetyou!(2)@ARGV除以上方法之外,我们还可以使用@ARGV。如同数组一般,@ARGV支持用户参数,这跟C语言中的argv,argc类似,在很多perlexploit中经常可以见到它。比如我们在对目标主机进行溢出攻击时,经常可见到像下面的指令:perlexploit.pl127.0.0.13424127.0.0.1是目标主机的IP地址,3424是端口号。下面我们举例讲解一下@ARGV的使用,以下代码将输入参数IP和Port保存在@ARGV数组中,而$0是用来代替被perl解释器所解释的文件名(比如perlriusksk.pl中$0=riusksk.pl):if(@ARGV!=2){print“Usage:perl$0IPPort\n”;exit;}($IP,$Port)=@ARGV;print“IPAddress:$IP,Portis$Port.\n”;输出结果:d:\perlriusksk.plUsage:perlriusksk.plIPPortd:\perlriusksk.pl127.0.0.11234IPAddress:127.0.0.1,Portis1234.(3)GetOpt这里我们
本文标题:Perl-快速-入门-教程
链接地址:https://www.777doc.com/doc-5282328 .html