Ruby for hacking
Dharma Family
Introdução
Esse artigo não tem como objetivo ensinar a programar, e sim mostrar pra vocês como é pratico trabalhar com ruby e criar aplicações diarias como de costume e/ou grande projetos, em geral achei uma ótima linguagem para o hacking, possui funções de sistema e não deixa a desejar na web, estudei ruby durante três dias e adorei, aconselho a todos verificarem e lerem a seguinte pagina da wikipedia, com a descrição da mesma
http://pt.wikipedia.org/wiki/Ruby_%28li ... %C3%A3o%29 (http://pt.wikipedia.org/wiki/Ruby_%28linguagem_de_programa%C3%A7%C3%A3o%29)
Interpretador
Ruby é uma linguagem orientada a objetos interpretada de código livre, podem fazer o download em http://www.ruby-lang.org/en/downloads/ (http://www.ruby-lang.org/en/downloads/) , possui versões para as principais plataformas, a IDE pode ser chamada na linha de comando digitando irb ou se preferirem podem usar o interpretador online no seguinte endereço http://tryruby.hobix.com/ (http://tryruby.hobix.com/), lembrando que para programas mais complexos precisaremos utilizar a linha de comando passando como argumento o nome do programa, do mesmo modo que em perl python etc.
Input / Output
A sintaxe é simples, vejam
puts "hello word"
que retorna "hello word", é como utilizar
#include
int main() {
printf("legal");
}
em C... para entrada de dados utilizamos gets
variavel = gets
a diferença com outras linguagens é que em ruby automaticamente é adicionado nova linha no final de cada valor de entrada e saida, por exemplo se eu digitar "legal" o valor retornado será "legal\n" .
em C o seguinte codigo retorna "legalrox"
#include
int main () {
printf("legal");
printf("rox");
}
oque é diferente em ruby, se fizessesmos dois puts do mesmo jeito, seria retornado "legal" e "rox" em linhas diferentes, codigo
puts "legal"
puts "rox"
como podem observar, a diferença está nos simples detalhes que ao decorrer de muito trabalho torna uma linguagem superior à outra em um determinado objetivo.
Operadores de fluxo
Como dito no wikipedia, a sintaxe é bem "enxuta", vejam exemplo de if, elsif, else
if 0 > 1
puts "eita interpretador ta doido"
elsif 1 == 1
puts "ta normal..."
elsif 1 > 1
puts "ta rox d+"
else
puts "esse um é uma string e vai dar erro na comparação"
end
tambem podemos usar unless
unless 1 < 0
puts "verdadeiro, porque unless é ao contrario de if, no caso unless quer dizer \"se não\", no nosso exemplo se 1 não for menor que 0"
else
puts "é...1 é menor que 0"
end
pros programadores de plantão reparem só nessa parte abaixo
valor = 100
numero =
case valor
when 0..10
puts "entre 0 e 10"
when 10..20
puts "entre 10 e 20"
when 20..100
puts "entre 20 e 100"
else
puts "valor não está entre as comparações"
end
pra quem não entendeu, o case pode ser usado para pegar ranges, e ainda guardar o valor retornado..
no nosso exemplo a variavel valor armazena o valor 100, a variavel numero pega todo o bloco e guarda o resultado dele, os when são para comparar ranges...
foi retornado "entre 1 e 100" porque valor está entre 1 e 100.
Loops
Vamos começar pelo while
i = 1
while i < 10
puts i
i += 1
end
retorna :
1
.
.
.
9
For já é mais interessante, achei ele melhor que em outras linguagens, vejam
for i in 0..5
puts i
end
retorna :
0
1
2
3
4
5
reparem que dois pontos, retorna seis valores, por causa do 0, se se usarmos tres pontos, retornaria apenas o numero exato de valores passado para a função, exemplo
for i in 0...5
puts i
end
retorna :
0
1
2
3
4
for em array
a = ['nascer', 'crescer', 'morrer']
for id in a
puts id
end
retorna :
nascer
crescer
morrer
for com uma faixa de caracteres
for letras in 'a'..'z'
puts letras
end
retorna :
a
.
.
.
z
obs : existem varios outros operadadores que podem ser encontrados na documentação do ruby ( http://www.ruby-doc.org (http://www.ruby-doc.org) )
Tratamento de erros
Para tratar erros, utilizamos o bloco begin/end e rescue, observe o exemplo
begin
i = 1
j = '1'
dois = i + j
rescue
puts "ocorreu um erro, impossivel completar operação"
end
oque aconteceu no exemplo acima é que não podemos somar um fixnum com uma string, então ocorre o erro "TypeError", se fosse pra tratar um erro especifico, deveriamos usar o seguinte
begin
i = 1
j = '1'
dois = i + j
rescue TypeError
puts "ocorreu TypeError, impossivel completar operação"
end
observem na diferença de rescue TypeError.
Podemos ter varios rescues tratando erros especificos, e um default que trate todos, exemplo
begin
i = 1
j = '1'
dois = i + j
rescue TypeError
puts "TypeError"
rescue
puts "ocorreu um erro, impossivel completar operação"
end
Quando o interpretador encontra um erro, ele pula pro primeiro rescue e continua assim até encontrar um rescue correspondente, depois de encontrar ele continua lendo o bloco, por exemplo
begin
i = 1
j = '1'
dois = i + j
rescue TypeError
puts "rox"
puts "legal"
rescue
puts "ocorreu um erro, impossivel completar operação"
end
No exemplo acima tambem será mostrado "legal" porque o rescue foi encontrado antes do rescue default, se quisessemos que ele saisse do bloco após encontrar um rescue, deveriamos utilizar self.exit, deixo à vocês um desafio que irao adorar, já que até agora nao falei da melhor parte :
basta usarmos "comando." e apertar table duas vezes, vai aparecer a lista dos atributos do mesmo, podem procurar o que melhor lhes sirva, vale lembrar que o nome do bloco principal é main, então podemos utilizar main como comando pra saber os atributos dele, ou self para se referir ao bloco que está sendo executado
obs : o interpretador online não disponibiliza a lista de propriedade dos comandos.
Funções
Mostrarei o basico aqui, observe bem
def mostrar(a)
puts a
end
a = "legal"
mostrar(a)
def é uma função basicamente, no exemplo acima definimos mostrar que pega a variavel passada como referencia e usa puts pra mostra-la.
podemos passar multiplas variaveis, como no exemplo abaixo
def mostrar(a,b)
puts a
puts b
end
a = "legal"
b = "maneiro"
mostrar(a,b)
retorna :
legal
maneiro
como em outras linguagens, podemos tambem deixar uma variavel como sendo default caso não seja passado todos argumentos, exemplo
def mostrar(a, b="demais")
puts a + b
end
a = "legal"
mostrar(a)
retorna :
legal demais
se a variavel b não fosse default retornaria "ArgumentError: wrong number of arguments (1 for 2)" porque não foram passada todas variaveis necessaria pra função.
Sockets
Para sockets precisamos usar uma biblioteca ( socket ), podemos chama-la utilizando
require 'socket'
é muito simples utiliza-los, podem encontrar maiores informações em http://www.ruby-doc.org/docs/Programmin ... twork.html (http://www.ruby-doc.org/docs/ProgrammingRuby/html/lib_network.html)
segue um exemplo abaixo de portscan feito com 22 linhas...
require 'socket'
include Socket::Constants
def Con(a)
socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
sockaddr = Socket.pack_sockaddr_in(a, ARGV[0])
begin
socket.connect( sockaddr )
rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT
$result = "Porta #{a} fexada"
end
if $result != "Porta #{a} fexada"
puts "Porta #{a} aberta"
else
puts $result
end
end
if ARGV.length > 2
for a in ARGV[1]..ARGV[2]
Con(a)
end
else
puts "ex : DharmaScan www.darkers.com.br (http://www.darkers.com.br) 1 100"
end
reparem que inclui tratamento de erros...
bom é isso, estamos com muito pouco tempo e nao dá pra criar grandes artigos, porem espero que os membros consigam abrir os olhos quanto à 'novas' linguagens que desempenham o papel de outras muito melhor no hacking, é claro que nao somos donos da verdade, por isso recomendamos a todos estudarem ruby e tirarem suas proprias conclusoes.
até mais
Muito bom branco ...
Começei a mecher com ruby, mais me desanimei no primeiro dia hehe ( preguisa mesmo)
sem mais