Ruby-Metasploit的核心
Ruby-Metasploit的核心
Ruby編程語(yǔ)言可以說(shuō)是Metasploit框架的核心。
根據(jù)Ruby官方網(wǎng)站介紹,Ruby編程語(yǔ)言簡(jiǎn)單而又強(qiáng)大,面向?qū)ο?#xff0c;為解釋性語(yǔ)言,執(zhí)行速度快,項(xiàng)目開(kāi)發(fā)周期短,可以構(gòu)建自動(dòng)化類(lèi)來(lái)重用代碼是Ruby語(yǔ)言的一個(gè)特點(diǎn),而這個(gè)特點(diǎn)正好滿(mǎn)足了Metasploit的需求。
日本的松本行弘在1995年設(shè)計(jì)并實(shí)現(xiàn)了Ruby語(yǔ)言。后來(lái)它被進(jìn)一步定義為功能類(lèi)似與Perl語(yǔ)言的、具有動(dòng)態(tài)特性和反射機(jī)制的、通用的面向?qū)ο?#xff08;OOP)的程序設(shè)計(jì)語(yǔ)言。
可以從http://Rubyinstaller.org/downloads/網(wǎng)站下載Windows/Linux版本的Ruby。
也可通過(guò)http://tryruby.org/levels/1/challenges網(wǎng)站獲得優(yōu)秀的Ruby資源。
Ruby語(yǔ)言的基礎(chǔ)知識(shí)
Ruby的交互式命令行
Ruby語(yǔ)言提供了一個(gè)可以進(jìn)行交互的命令行。在交互式命令行上進(jìn)行工作可以讓我們更清楚理解Ruby的基礎(chǔ)知識(shí)。
在CMD命令行或者終端窗口輸入命令irb來(lái)啟動(dòng)Ruby的交互式命令行。
輸入數(shù)字2:
irb(main):001:0> 2
=> 2
進(jìn)行加法運(yùn)算:
irb(main):002:0> 2 + 3
=> 5
對(duì)字符串操作:
irb(main):008:0> a = “Ruby”
=> “Ruby”
irb(main):009:0> b =“Metasploit”
=> “Metasploit”
irb(main):010:0> a + b
=> “Ruby Metasploit”
在命令行定義方法:
方法或者函數(shù)是一組語(yǔ)句,當(dāng)我們調(diào)用它們時(shí)會(huì)開(kāi)始執(zhí)行。可以簡(jiǎn)單地在Ruby交互命令行聲明一個(gè)方法,也可以在腳本里對(duì)它們進(jìn)行聲明。在使用Metasploit模塊時(shí),Ruby的方法是一個(gè)很重要的部分。
它的語(yǔ)法格式:
def method_name [([arg [= default]] … [, * arg [, &expr]])]
expr
end
要定義一個(gè)方法,首先以def開(kāi)始,之后隨其后的是方法的名稱(chēng),然后是包含在括號(hào)內(nèi)的參數(shù)和表達(dá)式。我們還將一個(gè)end聲明放在表達(dá)式的最后來(lái)結(jié)束對(duì)方法的定義。這里,arg指的是方法所接收的參數(shù),expr指的是方法接收并計(jì)算的表達(dá)式。
例如:
irb(main):002:0> def xorops(a,b)
irb(main):003:0> res = a ^ b
irb(main):004:0> return res
irb(main):005:0> end
=> :xorops
定義一個(gè)名為xoropos的方法,它接收a和b兩個(gè)參數(shù)。接著對(duì)接收到的參數(shù)進(jìn)行異或運(yùn)算,并將結(jié)果保存到一個(gè)名為res的新變量里。最后用return語(yǔ)句返回結(jié)果。
Ruby的輸出
Ruby語(yǔ)言提供了puts和print兩類(lèi)輸出形式,可以用print_good、print_status、print_error語(yǔ)句來(lái)表示成功執(zhí)行、狀態(tài)和錯(cuò)誤。
例如:
print_good(“Example of Print Good”)
print_error(“Example of Print Error”)
print_status(“Example of Print Status”)
當(dāng)在Metasploit模塊下運(yùn)行這些命令時(shí)會(huì)產(chǎn)生如下輸出,+符號(hào)并綠色顯示表示正常,*符號(hào)并藍(lán)色顯示表示狀態(tài)信息,-符號(hào)并紅色顯示表示錯(cuò)誤信息。
[ + ]Example of Print Good
[ - ]Example of Print Error
[ * ]Example of Print Status
字符串追加
當(dāng)需要在一個(gè)變量后面追加數(shù)據(jù)的時(shí)候,可以用<<運(yùn)算符。
例如
irb(main):001:0> a = “Ruby”
=> “Ruby”
irb(main):002:0> a << “Metasploit”
=> “Ruby Metasploit”
子字符串函數(shù)
在Ruby里可以輕松輸入substring函數(shù)來(lái)獲取子字符串——只需要指明子字符串在字符串內(nèi)的起始位置和長(zhǎng)度,就可以獲得它。
例如:
irb(main):001:0> a = “123678”
=> “123678”
irb(main):002:0> a[0,2]
=> “12”
irb(main):001:0> a[2,2]
=> “36”
split函數(shù)
可以輸入split函數(shù)將一個(gè)字符串類(lèi)型的值分割為一個(gè)變量數(shù)組。
例如:
irb(main):001:0> a = “mastering,metasploit”
=> “mastering,metasploit”
irb(main):002:0> b = a.split(",")
=> [“mastering”,“metasploit”]
irb(main):008:0> b[0]
=> “mastering”
irb(main):009:0> b[1]
=> “metasploit”
可以看到,現(xiàn)在已經(jīng)將字符串轉(zhuǎn)換成了一個(gè)新的數(shù)組b,這個(gè)數(shù)組b包括b[0]和b[1]兩個(gè)元素,分別為“mastering”和“metasploit”。
Ruby的數(shù)字和轉(zhuǎn)換
可以直接在算術(shù)運(yùn)算里采用數(shù)字。在處理用戶(hù)的輸入時(shí),可以用to_i函數(shù)將字符串類(lèi)型的輸入轉(zhuǎn)換成整數(shù)。另一方面,也可以采用to_s將一個(gè)整數(shù)轉(zhuǎn)換成字符串。
例如:
irb(main):001:0> a = “23”
=> “23”
irb(main):002:0>a.to_i + 10
=> 33
irb(main):006:0> am = 29
=> 29
irb(main):007:0> aa = “hello”
=> “hello”
irb(main):008:0> am.to_s + aa
=> “29hello”
Ruby的數(shù)值轉(zhuǎn)換
在采用滲透模塊和其他模塊時(shí),都將利用到各個(gè)轉(zhuǎn)換機(jī)制。
16進(jìn)制到10進(jìn)制的轉(zhuǎn)換:
例如:
irb(main):001:0> a = “10”
=> “10”
irb(main):002:0> a.hex
=> 16
10進(jìn)制到16進(jìn)制的轉(zhuǎn)換:
例如:
和上例相反的操作可以采用to_s來(lái)實(shí)現(xiàn):
irb(main):003:0> 16.to_s(16)
=> “10”
Ruby的范圍
范圍(range)是一個(gè)很重要的內(nèi)容,廣泛應(yīng)用在Metasploit的輔助模塊里,例如掃描模塊和測(cè)試模塊。
定義一個(gè)范圍,并且查看一下可以對(duì)此數(shù)據(jù)類(lèi)型進(jìn)行哪些操作:
irb(main):002:0> zero_to_nine= 0…9
=> 0…9
irb(main):003:0> zero_to_nine.include?(4)
=>true
irb(main):004:0> zero_to_nine.include?(11)
=> false
irb(main):005:0> zero_to_nine.each{|zero_to_nine| print(zero_to_nine)}
0123456789=> 0…9
irb(main):006:0> zero_to_nine.min
=> 0
irb(main):007:0> zero_to_nine.max
=> 9
可以看到一個(gè)范圍對(duì)象提供的操作,例如搜索、查找最小值和最大值,以及顯示范圍內(nèi)的所有數(shù)據(jù)。這里的include?函數(shù)可以檢查范圍內(nèi)是否包括某個(gè)特定的值。此外,min和max函數(shù)可以顯示出范圍內(nèi)的最小值和最大值。
Ruby的數(shù)組
可以簡(jiǎn)單地將數(shù)組定義為一系列元素的集合。
例如:
irb(main):001:0> name = [“Ruby”,“metasploit”]
=> [“Ruby”,“metasploit”]
irb(main):002:0> name[0]
=> “Ruby”
irb(main):003:0> name[1]
=>“metasploijt”
學(xué)到這里,已經(jīng)介紹了所有編寫(xiě)的Metasploit模塊必需的變量和數(shù)據(jù)類(lèi)型的相關(guān)知識(shí)。
有關(guān)變量的數(shù)據(jù)類(lèi)型的更多信息,請(qǐng)?jiān)L問(wèn):http://www.tutorialspoint.com/ruby/
有關(guān)利用Ruby編程的速查表,請(qǐng)參考https://github.com/savini/cheatsheets/raw/master/ruby/,再點(diǎn)擊RubyCheat.pdf
若你現(xiàn)在正從別的語(yǔ)言向Ruby語(yǔ)言過(guò)渡,這有一份推薦材料:http://hyperpolyglot.org/scripting
Ruby的方法
方法為函數(shù)的另一個(gè)說(shuō)法。除了Ruby程序員以外,其他背景的程序員可能經(jīng)常使用這兩類(lèi)叫法。方法就是指能執(zhí)行特定操作的子程序。方法的使用實(shí)現(xiàn)了代碼的重用,大大縮短了程序的長(zhǎng)度。定義一個(gè)方法很容易,在定義開(kāi)始的地方使用def關(guān)鍵字,在結(jié)束的地方使用end關(guān)鍵字。
例如:
打印出50個(gè)空格:
def print_data(part1)
square = par1 * par1
return square
end
answer = print_data(50)
print(answer)
這里的print_data方法接收主函數(shù)發(fā)送過(guò)來(lái)的參數(shù),然后讓其乘以自身,再使用return將結(jié)果返回。這個(gè)程序?qū)⒎祷氐闹捣诺搅艘粋€(gè)名為answer的變量?jī)?nèi),隨后輸出流這個(gè)值。
決策運(yùn)算符
與其他任何編程語(yǔ)言一樣,決策在Ruby里也是一個(gè)簡(jiǎn)單的概念:
例如:
irb(main):001:0> 1 > 2
=> false
同樣,再來(lái)查看一個(gè)字符串?dāng)?shù)據(jù)的例子:
irb(main):005:0> “Ruby” == “ruby”
=> false
irb(main):006:0> “Ruby” == “Ruby”
=>true
來(lái)看一個(gè)利用決策運(yùn)算符的簡(jiǎn)單程序:
def find_match(a)
if a =~ /Metasploit/
return true
else
return false
end
end
#主函數(shù)從這里開(kāi)始
a = “128924983Metasploitduidsamerican”
bool_b=find_matcch(a)
print bool_b.to_s
在上面的這個(gè)程序里,利用了一個(gè)包含有“Metasploit” 的字符串,這個(gè)字符串里的“Metasploit”前后都添加了一些無(wú)用字符。然后將這個(gè)字符串賦值給變量a。接下來(lái),將該變量傳遞給函數(shù)find_match(),這個(gè)函數(shù)的作用是檢查該變量是否可以匹配正則表達(dá)式/Metasploit/。若這個(gè)變量里包含了“Metasploit”,函數(shù)的返回值就是true,否則就將false賦值給bool_b變量。
運(yùn)行上面這個(gè)方法將會(huì)產(chǎn)生一個(gè)true,這是因?yàn)榘凑諞Q策運(yùn)算符=~的計(jì)算,這兩個(gè)值是匹配的。
前面的程序在Windows系統(tǒng)環(huán)境下執(zhí)行完成后,輸出的結(jié)果如下:
C:\Ruby23-x64\bin>ruby.exe a.rb
true
Ruby的循環(huán)
迭代語(yǔ)句被稱(chēng)為循環(huán)。
例如:
def forl(a)
for i in 0…a
print(“Number #{i}n”)
end
end
forl(10)
上面的代碼按照定義的范圍從0遍歷到10,實(shí)現(xiàn)了循環(huán)打印輸出當(dāng)前的值。在這里我們利用#{i}去打印輸出變量i的值。關(guān)鍵字n指定開(kāi)始了新的一行。因此,每一次打印輸出變量時(shí),都會(huì)自動(dòng)占用新的一行。
迭代循環(huán)是通過(guò)each事先的。這是十分常見(jiàn)的做法,在Metasploit模塊里被廣泛采用。
例如:
def each_example(a)
a.each do |i|
print i.to_s + “t”
end
end
#主函數(shù)從這里開(kāi)始
a = Array.new(5)
a = [10,20,50,90,111]
each_example(a)
在上面的代碼里,定義了一個(gè)方法,這個(gè)方法接收一個(gè)數(shù)組a,然后將數(shù)組a的所有元素用each循環(huán)打印出來(lái)。利用each方法完成會(huì)將數(shù)組a里的元素臨時(shí)保存到i里,一直到下一個(gè)循環(huán)時(shí)再重寫(xiě)這個(gè)變量的值。輸出語(yǔ)句里的.t表示一個(gè)制表位(tab)。
有關(guān)循環(huán)的更多信息,請(qǐng)?jiān)L問(wèn):http://www.tutorialspoint.com/Ruby/Ruby_loops.htm
正則表達(dá)式
正則表達(dá)式用來(lái)匹配一個(gè)字符串或者獲取字符串在一組給定的字符串或一個(gè)句子里出現(xiàn)的次數(shù)。在Metasploit里,正則表達(dá)式十分關(guān)鍵。在編寫(xiě)漏洞檢查工具和掃描工具以及分析某個(gè)給定端口的響應(yīng)時(shí),總會(huì)需要利用正則表達(dá)式。
看一個(gè)例子,這里的程序演示了正則表達(dá)式的使用。
有一個(gè)變量,它的值為Hello world,需要為它設(shè)計(jì)一個(gè)正則表達(dá)式。代碼如下:
irb(main):001:0> n = “Hello world”
=> “Hello world”
irb(main):002:0> r = /world/
=> /world/
irb(main):003:0> r.match n
=> #<MatchData “world”>
irb(main):004:0> n =~ r
=> 6
創(chuàng)建另一個(gè)名為r的變量,并把正則表達(dá)式內(nèi)容——/world/保存在其內(nèi)。在下一行,我們用MatchData類(lèi)的match對(duì)象將這個(gè)字符和正則表達(dá)式進(jìn)行匹配。命令行返回了一個(gè)匹配成功的信息MatchData “world”。接下來(lái)利用另一個(gè)運(yùn)算符=~來(lái)完成字符串的匹配操作,返回匹配的具體位置。例如:
irb(main):001:0> r = /^world/
=> /^world/
irb(main):002:0> n =~ r
=> nil
irb(main):003:0> r = /^Hello/
=> /^Hello/
irb(main):004:0> n =~ r
=> 0
irb(main):005:0> r = / world $/
=> / world $/
irb(main):006:0> n =~ r
=> 6
分配一個(gè)新的值/^world/給r,這里 ^運(yùn)算符表示要匹配字符串的開(kāi)始位置。我們得到了輸出nil,這說(shuō)明并沒(méi)有匹配成功。我們修改這個(gè)表達(dá)式以匹配單詞hello開(kāi)始的字符串。這一次,系統(tǒng)的輸出為數(shù)字0,這意味著在最開(kāi)始的位置匹配成功。下一步,將正則表達(dá)式修改為/world $/,這意味著只有一個(gè)以單詞world結(jié)尾的字符串才會(huì)匹配。
有關(guān)Ruby正則表達(dá)式的更多信息,請(qǐng)?jiān)L問(wèn):http://www.tutorialspoint.com/Ruby/Ruby_regular_expressions.htm
下方的鏈接提供了Ruby編程語(yǔ)言速查卡,可以讓你的編程更高效:
https://github.com/savini/cheatsheets/raw/master/Ruby/RubyCheat.pdf
http://hyperpolyglot.org/scripting
有關(guān)如何構(gòu)建正確的正則表達(dá)式的更多信息:請(qǐng)?jiān)L問(wèn):http://rubular.com
Ruby基礎(chǔ)知識(shí)小結(jié)
可以從下面的網(wǎng)址獲得極為優(yōu)秀的Ruby編程資源:
一個(gè)豐富的Ruby語(yǔ)言教程資源庫(kù):
http://tutorialspoint.com/Ruby/
可以幫助你提高Ruby語(yǔ)言編程效率的速查表的鏈接:
https://github.com/savini/cheatsheets/raw/master/Ruby/RubyCheat.pdf
http://hyperpolyglot.org/scripting
有關(guān)Ruby的更多信息,請(qǐng)?jiān)L問(wèn):http://en.wikibooks.org/wiki/Ruby_Programming
總結(jié)
以上是生活随笔為你收集整理的Ruby-Metasploit的核心的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql 流程控制语句,mysql
- 下一篇: 数据库常见相关问题