Ruby for hacking

Started by branco, 10 de March , 2007, 11:34:28 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

branco

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

Interpretador
   Ruby é uma linguagem orientada a objetos interpretada de código livre, podem fazer o download em 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/, 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 )

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

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 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
Olha o trem... Quem vai ficar, quem vai partir? Quem vai chorar, quem vai sorrir?

insanity

Muito bom branco ...

Começei a mecher com ruby, mais me desanimei no primeiro dia hehe ( preguisa mesmo)

sem mais