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