Daniel Moreno
Novatec
© Novatec Editora Ltda. 2018. Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. É proibida a reprodução desta obra, mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da Editora. Editor: Rubens Prates PY20180711 Revisão gramatical: Smirna Cavalheiro Editoração eletrônica: Carolina Kuwabata Capa: Carolina Kuwabata ISBN: 978-85-7522-692-6 Histórico de impressões: Julho/2018
Primeira edição
Novatec Editora Ltda. Rua Luís Antônio dos Santos 110 02460-000 – São Paulo, SP – Brasil Tel.: +55 11 2959-6529 Email: novatec@novatec.com.br Site: www.novatec.com.br Twitter: twitter.com/novateceditora Facebook: facebook.com/novatec LinkedIn: linkedin.com/in/novatec
capítulo 1
Introdução ao Python
1.1 Introdução ao Python O Python, por ser uma linguagem interpretada, não necessita que o código-fonte seja compilado (convertido para arquivo binário). Para executar um script Python é necessário que o compilador Python esteja instalado na máquina. No Kali Linux, crie o arquivo olaMundo.py: print "Meu primeiro script"
Execute o script olaMundo.py: root@kali# python2.7 olaMundo.py Meu primeiro script
Muitas vezes será necessário armazenar o conteúdo em uma variável, bastando usar o sinal de igual (script nome.py): nome = raw_input("Digite o seu nome: ") ❶ print "O seu nome:", nome ❷ ❶ Utiliza a função raw_input para aguardar o usuário digitar algo, armazenando
esse valor na variável nome (o sinal de igual é chamado de atribuição). ❷ Exibe
na tela o conteúdo da variável nome. A vírgula é usada para que seja exibida a mensagem “O seu nome”: seguida do conteúdo da variável nome.
Execute o script nome.py:
17
18
Python para Pentest root@kali# python2.7 nome.py Digite o seu nome: Daniel O seu nome: Daniel
Os principais tipos de dados do Python são: inteiro, ponto flutuante, texto, booleano, lista, tupla, dicionário e conjuntos, que serão abordados em seguida.
1.2 Tipos de dados 1.2.1 Inteiros Os números inteiros são representados na forma 1, 2, 3 etc. As operações matemáticas são representadas na forma +, -, *, / e % (o módulo é o resto da divisão). Exemplo (script operacoes.py): # -*- coding: utf-8 -*soma = 1 + 1 subtracao = 1 - 1 multiplicacao = 2 * 2 divisao = 5 / 2 modulo = 5 % 2 pFlutuante = 0.5 print "Soma 1+1 =", soma print "Subtração 1-1 =", subtracao print "Multiplicação 2*2 =", multiplicacao print "Divisão 5/2 =", divisao print "Módulo 5%2 =", modulo print "Ponto flutuante =", pFlutuante
Execute o script operacoes.py: root@kali# python2.7 operacoes.py Soma 1+1 = 2 Subtracao 1-1 = 0 Multiplicacao 2*2 = 4 Divisao 5/2 = 2 Modulo 5%2 = 1 Ponto flutuante = 0.5
Capítulo 1 ■ Introdução ao Python
19
Outra forma de realizar operações matemáticas é abreviando o nome da variável, desde que a operação esteja envolvendo a própria variável. Exemplo (script operacoes2.py): soma = 1 soma = soma + 1 # Outra forma soma += 1 subtracao = 1 subtracao = subtracao - 1 # Outra forma subtracao -= 1
1.2.2 Texto O texto (ou string) são representados entre aspas simples ou duplas. Exemplo (script texto.py): nome_completo = "Daniel Moreno" ❶ nome_completo_aspas = """Daniel Henrique Negri Moreno""" ❷ nome_completo_quebra = "Daniel \ Moreno" ❸ nome = "Daniel" sobrenome = "Moreno" print "Nome completo (1a forma):", nome_completo ❹ print "Nome completo (2a forma):" + nome_completo ❺ print "Nome completo (3a forma):" + "Daniel" + "Henrique " + "Negri" + "Moreno" ❻ print "Nome completo (4a forma):" + "Daniel" , "Henrique " + "Negri" , "Moreno" ❼ print "Nome completo (5a forma):", nome_completo_aspas print "Nome completo (6a forma):", nome_completo_quebra print "Nome completo (7a forma): %s" %nome_completo ❽ print "Nome completo (8a forma): %s %s" %(nome, sobrenome) ❾ print "Nome repetido duas vezes:", nome_completo * 2 ❿
20
Python para Pentest ❶
Define uma string delimitada por aspas duplas (aspas simples também podem ser usadas). Em muitos casos, dependendo do tamanho do texto, uma string poderá ser dividida em várias linhas, devendo ser delimitada por três aspas duplas (ou simples – linha ❷).
❸
Utiliza a barra invertida para quebrar a string em mais de uma linha. Não somente uma string, mas qualquer instrução que seja muito extensa e que visualmente ficará melhor em uma linha separada poderá utilizar a barra invertida.
❹ Utiliza
a vírgula como separador. Dessa forma é exibido o texto "O meu nome completo (1a forma)" seguido do conteúdo da variável nome_completo. Ao executar o script, atente que é inserido um espaço entre as duas strings.
❺ Utiliza
o sinal de +, juntando as duas strings. Diferente dos números, strings são aglutinadas. Por exemplo 1 + 1 será igual a 2. Já "1" + "1" será igual a string "11". Ao executar o script, perceba que as strings ficam grudadas, sem espaço entre si.
❻ Aglutina várias strings. ❼ Alterna
entre o uso de vírgula e o sinal de +: o texto entre o sinal de + será aglutinado e o texto entre o sinal de vírgula será separado por espaço.
❽
Utiliza a formatação por meio do sinal de porcentagem. O %s significa que em seu lugar será inserida uma string. A Tabela 1.1 contém os principais tipos de dados que podem acompanhar o sinal de porcentagem: Tabela 1.1 – Caracteres especiais
Caractere
Significado
%s
String (Texto).
%d
Integer (Inteiro). Float (Ponto flutuante). O número de casas decimais é definido antes do f. "%10f" %0.5 significa que a saída terá no mínimo 10 caracteres (incluindo o ponto e casas decimais), sendo preenchidos com espaços em brancos à esquerda caso não atinja o mínimo de 10 caracteres. Já "%5.2f" %0.5 significa que a saída terá no mínimo 5 caracteres (incluindo o ponto e casas decimais), sendo que a casa decimal terá no máximo dois caracteres. Hexadecimal. "%x" %16 significa que o 16 está em hexadecimal (equivalente ao inteiro 10).
%f
%x
❾ É similar à linha ❽: caso vários valores sejam usados, utilize uma tupla. ❿
Utiliza o sinal de multiplicação para “multiplicar” a string duas vezes. Exibindo a mensagem "Daniel MorenoDaniel Moreno". Tanto a multiplicação quanto a adição são chamados de açúcares sintáticos (sugar syntax), que modificam o comportamento da string.
Capítulo 1 ■ Introdução ao Python
21
Há diversos métodos que podem ser usados com objetos do tipo string. Observe a linha ❶: a variável nome_completo é um objeto da classe string. Os métodos upper() e lower() retornam todos os caracteres da string em maiúsculo e minúsculo, respectivamente. Exemplo (script metodos.py): nome = "Daniel Moreno" nome_maiusculo = nome.upper() nome_minusculo = nome.lower() print "Nome ->", nome print "Nome maiúsculo ->", nome_maiusculo print "Nome minúsculo ->", nome_minusculo
Execute o script metodos.py: root@kali# python2.7 medotos.py Nome -> Daniel Moreno Nome maiusculo -> DANIEL MORENO Nome minusculo -> daniel moreno
1.2.2.1 Principais métodos Os principais métodos são listados na Tabela 1.2. Tabela 1.2 – Principais métodos Método
Significado
count("termo")
Conta o número de vezes que o termo aparece na string.
encode("tipo")
Codifica a string.
decode("tipo")
Decodifica a string.
find("termo") index("termo") join("termo")
Retorna o índice do termo. Retorna -1 caso o termo não seja encontrado. Retorna o índice do termo. Retorna uma exceção do tipo ValueError caso o termo não seja encontrado. Junta o termo com a string. A string é tratada como um separador.
lower() Retorna a string em caracteres minúsculos. replace("termo antigo", Substitui o termo antigo pelo termo novo. "termo novo") Similar ao método find, com a diferença que a busca é feita de forma rfind("termo") reversa (a busca começa pelo último caractere da string, até chegar no primeiro).
22
Python para Pentest Método
Significado
rstrip("termo")
Remove o termo à direita da string.
split("termo")
Divide a string. Caso o termo não seja usado para dividir a string, a divisão é feita por espaços ou caracteres de nova linha. Retorna uma lista.
startswith("termo")
Verifica se a string inicia pelo termo. Retorna um booleano.
strip("termo")
Remove o termo à direita e à esquerda da string. Caso o termo não seja fornecido, serão removidos os espaços e as novas linhas.
upper()
Retorna a string em caracteres maiúsculos.
Exemplos: • count – Script count.py: nome = "Daniel Moreno" print "O caractere O aparece %s vezes" %nome.count("o")
• encode e decode – Script encode.py: nome = "Daniel Moreno" codificado = nome.encode("base64") decodificado = codificado.decode("base64") print nome, "codificado em base64:", codificado print codificado, "decodificado em base64:", decodificado
• find, index e rfind – Script find.py. Os índices são sempre iniciados pelo valor zero. Por exemplo, o caractere “D” está no índice 0, “a” está no índice 1 etc. # -*- coding: utf-8 -*nome = "Daniel Moreno" print "O caractere O está print "Os caracteres OREN print "O caractere O está print "O caractere U está print "O caractere U está
• join – Script join.py: print "-".join("abc") print "XYZ".join("abc")
na posição: %s" %nome.find("o") começam pela posição: %s" %nome.find("oren") na posição: %s" %nome.rfind("o") na posição: %s" %nome.find("U") na posição: %s" %nome.index("U")
Capítulo 1 ■ Introdução ao Python
23
• lower e upper – Script lower.py: # -*- coding: utf-8 -*nome = "Daniel Moreno" print nome, "em minúsculo:", nome.lower() print nome, "em maiúsculo:", nome.upper()
• replace – Script replace.py: nome = "Daniel Moreno" print "Substituindo Moreno por Henrique:", nome.replace("Moreno","Henrique")
• rstrip e strip – Script rstrip.py: # -*- coding: utf-8 -*nome = "xDaniel Morenox" print "Removendo X à direita e esquerda:", nome.strip("x") print "Removendo X à direita:", nome.rstrip("x")
• split – Script split.py: nome = "Daniel Henrique Negri Moreno" print "Dividindo o nome em uma lista:", nome.split()
• startswith – Script startswith.py: nome = "Daniel Moreno" print "O nome inicia com Dan?", nome.startswith("Dan") print "O nome inicia com Mor?", nome.startswith("Mor")
O operador in e not int são muito usados para verificar se um termo está ou não contido em uma string. Exemplo (script operadorIN.py): # -*- coding: utf-8 -*nome = "Daniel Moreno" print "O nome contém o termo niel?" print "niel" in nome print "O nome contém o termo BLA?"
24
Python para Pentest print "BLA" in nome print "O nome não contém o termo BLA?" print "BLA" not in nome
1.2.2.2 Caracteres especiais Algumas strings são tratadas como caracteres especiais. A Tabela 1.3 lista os principais tipos. Tabela 1.3 – Caracteres especiais Caractere
Significado
\n
Nova linha.
\r\n
Nova linha.
\t
Tabulação.
\\
Barra invertida.
Exemplo (script especiais.py): print "Daniel\t\tMoreno" print "Daniel\nMoreno" print "Daniel\\Moreno"
1.2.3 Booleano Os booleanos são apenas True ou False, indicando uma condição verdadeira ou falsa. No script booleano.py, caso o booleano seja True, o bloco de códigos dentro do if será executado: # -*- coding: utf-8 -*if True: print "Bloco IF será executado" else: print "Bloco ELSE não será executado"
Os operadores and e or também são usados com booleanos. No operador lógico and a saída será verdadeira somente se todas as entradas forem verdadeiras. A Tabela 1.4 mostra os valores de saída para duas entradas.
Capítulo 1 ■ Introdução ao Python
25
Tabela 1.4 – Operador lógico and Entrada
Entrada
Saída
True
True
True
True
False
False
False
True
False
False
False
False
No operador lógico or a saída será verdadeira se pelo menos uma entrada for verdadeira. A Tabela 1.5 mostra os valores de saída para duas entradas. Tabela 1.5 – Operador lógico or Entrada
Entrada
Saída
True
True
True
True
False
True
False
True
True
False
False
False
Exemplo (script booleano2.py): # -*- coding: utf-8 -*if True and True: print "Bloco 1 será executado" if True and False: print "Bloco 2 não será executado" if True or False: print "Bloco 3 será executado" if False or False: print "Bloco 4 não será executado"
1.2.4 Lista As listas armazenam valores: inteiros, ponto flutuante, strings, outras listas etc. Exemplo (script lista.py): lista = ["alface", "tomate", "cenoura", 1, 2, 3, ["alface2", "tomate2"] ] print lista[0]
26
Python para Pentest print lista[3] print lista[-1] print lista[6] print lista[6][0] lista[0] = "beterraba" print lista[1:3]
Para acessar um item da lista, basta utilizar o seu índice (sempre iniciado pelo valor zero). Exemplo: primeiro elemento (lista[0]), quarto elemento (lista[3]) etc. Os elementos podem ser acessados via índice reverso. Exemplo: último (lista[-1]), penúltimo (lista[-2]) etc. Ao acessar o sétimo elemento, a lista ["alface2", "tomate2", "cenoura2"] é retornada. Para acessar a string alface2: lista[6][0] e para acessar a string tomate2: lista[6][1]. Os elementos da lista podem ser redefinidos. Para trocar "alface" por "beterraba": lista[0] = "beterraba". Trechos da lista podem ser selecionados. Para gerar uma lista contendo os elementos de índice 1 a 3 (exluindo-se o índice 3): lista[1:3]. Para selecionar do segundo ao último índice: lista[1:] (nesse caso o último índice é incluído) e para selecionar todos os elementos: lista[:].
1.2.4.1 Principais métodos Os principais métodos são listados na Tabela 1.6. Tabela 1.6 – Principais métodos Método
Significado
append("termo")
Adiciona o termo como elemento da lista.
index("termo")
Retorna o índice do termo. Retorna uma exceção do tipo ValueError caso o termo não seja encontrado.
insert(indice, "termo") Insere o termo no índice desejado. pop(indice)
Remove e retorna o elemento com determinado índice. Se o índice não é fornecido, é removido o último elemento.
remove("termo")
Remove a primeira ocorrência do termo, sem retorná-lo.
sort()
Organiza em ordem alfabética os elementos.
Capítulo 1 ■ Introdução ao Python
Exemplos: • append – Script append.py: lista = ["alface", "tomate", "cenoura"] lista.append("beterraba") lista.append(["alface2", "tomate2"]) print lista
• index – Script index.py: lista = ["alface", "tomate", "cenoura"] print "Index do elemento tomate:", lista.index("tomate")
• insert – Script insert.py: # -*- coding: utf-8 -*lista = ["alface", "tomate", "cenoura"] print "A beterraba será inserida no index 0" lista.insert(0, "beterraba") print lista
• pop – Script pop.py: # -*- coding: utf-8 -*lista = ["alface", "tomate", "cenoura", "tomate"] print "O elemento de índice 2 é removido da lista e armazendo na variável CENOURA" CENOURA = lista.pop(2) print lista print CENOURA
• remove – Script remove.py: # -*- coding: utf-8 -*lista = ["alface", "tomate", "cenoura", "tomate", "tomate"] print "A primeira ocorrência do termo TOMATE será removida" lista.remove("tomate") print lista
27
28
Python para Pentest
• sort – Script sort.py: lista = ["alface", "tomate", "cenoura"] lista.sort() print lista
1.2.5 Tupla Uma tupla é considerada uma lista imutável, ou seja, não é possível redefinir os seus valores (será gerado um erro do tipo TypeError caso o usuário tente redefinir algum valor). Exemplo (script tupla.py): tupla = ("alface", "tomate", "cenoura") tupla[0] = "beterraba"
Uma tupla de um único elemento deve ser definida entre parênteses e uma vírgula. Exemplo (script tupla2.py): tupla = ("alface", ) print tupla[0]
1.2.6 Dicionário Um dicionário é uma lista de dados organizados no formato chave:valor, separados por vírgula. Exemplo (script dicionario.py): # -*- coding: utf-8 -*dicionario = {"chave1" : "valor1", "chave2" : "valor2", 666 : ["alface", "tomate", "cenoura"] } print "Conteúdo da chave CHAVE1:", dicionario["chave1"] print "Conteúdo da chave 666:", dicionario[666] print "Para acessar o valor ALFACE:", dicionario[666][0] print "Alterando o valor da CHAVE1" dicionario["chave1"] = "novo valor"
Capítulo 1 ■ Introdução ao Python
29
1.2.6.1 Principais métodos Os principais métodos são listados na Tabela 1.7. Tabela 1.7 – Principais métodos Método
Significado
keys()
Retorna uma lista contendo todas as chaves.
values()
Retorna uma lista contendo todos os valores.
iteritems()
Retorna um objeto contendo os pares chave:valor.
Exemplos: • keys e values – Script keys.py: dicionario = {"chave1" : "valor1", "chave2" : "valor2"} print "Chaves ->", dicionario.keys() print "Valores ->", dicionario.values()
• iteritems – Script iteritems.py: dicionario = {"chave1" : "valor1", "chave2" : "valor2"} for chave, valor in dicionario.iteritems(): print "Chave ->", chave print "Valor ->", valor print #Imprime uma linha em branco
1.2.7 Conjuntos Um conjunto é um conjunto de valores que não devem ser repetidos. O conjunto é definido de forma similar ao dicionário, com a diferença de que são inseridos apenas valores. Exemplo (script conjunto.py): # -*- coding: utf-8 -*conjunto = {"alface", "tomate", "cenoura", "beterraba", "tomate"} print "Atente que o tomate não é repetido:", conjunto
30
Python para Pentest
1.2.7.1 Principais métodos Os principais métodos são listados na Tabela 1.8. Tabela 1.8 – Principais métodos Método add("valor") copy()
Significado Adiciona um valor no conjunto, ignorando-o caso o valor já esteja no conjunto. Cria um novo conjunto, contendo uma cópia de seus valores.
Realiza a diferença dos dois conjuntos. O resultado é um conjunto difference(conjunto) contendo os valores que estão no primeiro conjunto e que não estão no segundo conjunto. pop() Remove um valor do conjunto, retornando-o.
Exemplos: • add – Script add.py: # -*- coding: utf-8 -*conjunto = {"alface", "tomate", "cenoura", "beterraba" } conjunto.add("tomate") print "Atente que o tomate não é repetido:", conjunto
• copy – Script copy.py: # -*- coding: utf-8 -*conjunto = {"alface", "tomate", "cenoura", "beterraba" } novo_conjunto = conjunto.copy() print "A variável novo_conjunto é uma cópia da variável conjunto:", novo_conjunto
• difference – Script difference.py: # -*- coding: utf-8 -*conjunto = {"alface", "tomate", "cenoura", "beterraba" } outro_conjunto = {"cenoura", "beterraba" } print "Diferença entre conjuntos:", conjunto.difference(outro_conjunto)
• pop – Script pop.py: conjunto = {"alface", "tomate", "cenoura", "beterraba" } print conjunto.pop()
Capítulo 1 ■ Introdução ao Python
31
1.3 Atribuição e comparação Em Python, a atribuição é diferente da comparação. A atribuição é feita utilizando-se o sinal de =. Já a comparação é feita usando-se dois sinais de =. Exemplo (script comparacao.py): # -*num = print print
coding: utf-8 -*1 "A variável NUM recebeu 1" "A variável NUM está sendo comparada com o valor 1:", num == 1
A atribuição de múltiplas variáveis pode ser feita usando-se uma única linha. Exemplo (script atribuicao.py): num1, print print print
texto, lista = 666, "texto qualquer", ["alface", "tomate", "cenoura"] "num1 =", num1 "texto =", texto "lista =", lista
1.4 Casting e variáveis vazias Em alguns casos é possível realizar a conversão de um tipo de variável em outro (casting). Exemplo (script casting.py): # -*- coding: utf-8 -*num1 = 666 print "Variável NUM1:", type(num1) num1 = str(num1) print "Variável NUM1:", type(num1)
Os principais tipos de casting são: • int() – Converte para inteiro. • float() – Converte para ponto flutuante. • bool() – Converte para booleano.
32
Python para Pentest
• str() – Converte para string. • list() – Converte para lista. • dict() – Converte para dicionário. • set() – Converte para conjunto. Exemplo (script casting2.py): # -*print print print print print print print print
coding: utf-8 -*"Texto 1 para o inteiro 1:", int("1") "Texto 0.1 para o ponto flutuante 0.1:", float("0.1") "Inteiro 0 para o booleano False:", bool(0) "Inteiro 1 para o texto 1:", str(1) 'Texto ABC para a lista ["a", "b", "c"]:', list("abc") 'Texto ABC para a tupla ("a", "b", "c"):', tuple("abc") "Cria um dicionário:", dict(chave1 = "valor1", chave2 = "valor2") 'Lista ["a", "b", "c", "c"] para conjunto:', set(["a", "b", "c", "c"])
Em alguns casos será necessário criar variáveis vazias, sem nenhum conteúdo. Exemplo (script casting3.py): inteiro, ponto_flutuante, texto, lista, dicionario, tupla, conjunto = int(), float(), str(), list(), dict(), tuple(), set()
Outra forma (script casting4.py): inteiro, ponto_flutuante, texto, lista, dicionario, tupla = 0, 0.0, "", [], {}, ()
1.5 Condicionais e laços de repetição Laços de repetição são utilizados no intuito de repetir blocos de código. Os principais são: for e while. Todo o código que deva ser executado dentro de um laço de repetição ou condicional deve estar indentado à direita.
Capítulo 1 ■ Introdução ao Python
33
O script for.py imprimirá os números de 0 a 9: # -*- coding: utf-8 -*for numero in range(10): # A função range cria uma lista com valores no intervalo definido # Exclui-se o último elemento # Exemplo: range(1,10) cria uma lista de inteiros de 1 a 9 # Exemplo: range(10) cria uma lista de inteiros de 0 a 9 print numero
Caso o objeto iterável (variável lista) seja uma lista, a variável valor representa cada elemento da lista. Exemplo (script for2.py): lista = [1, "texto", 3] for valor in lista: print valor
Caso o objeto iterável (variável string) seja um texto, a variável caractere representa cada caractere da string. Exemplo (script for3.py): string = "texto qualquer" for caractere in string: print caractere
Caso o objeto iterável (variável dicionario) seja um dicionário, a variável chave representa cada chave do dicionário. Exemplo (script for4.py): dicionario = {"chave1" : "valor1", "chave2" : "valor2"} for chave in dicionario: print chave
Outra forma (script for5.py): dicionario = {"chave1" : "valor1", "chave2" : "valor2"} for chave in dicionario.keys(): print chave
34
Python para Pentest
Para acessar os valores (script for6.py): dicionario = {"chave1" : "valor1", "chave2" : "valor2"} for valor in dicionario.values(): print valor
Para acessar chave e valor (script for7.py): dicionario = {"chave1" : "valor1", "chave2" : "valor2"} for item in dicionario: print "Chave ->", item print "Valor ->", dicionario[item]
Outra forma (script for8.py): dicionario = {"chave1" : "valor1", "chave2" : "valor2"} for chave,valor in dicionario.iteritems(): print "Chave ->", chave print "Valor ->", valor
O laço while é similar ao for, porém a condição de parada deve ser definida manualmente. Exemplo (script while.py): # -*- coding: utf-8 -*x = 0 while True: x += 1 if x == 10: break #Interrompe o laço de repetição elif x == 5: continue #Continua no próximo ciclo while, não executando o print print "Valor de X ->", x print "Somente quando x = 10 o resto do script será executado"
As principais condicionais são o if, elif e else. O if é usado para verificar se determinada condição é verdadeira.
Capítulo 1 ■ Introdução ao Python
35
Exemplo (script if.py): # -*- coding: utf-8 -*if 1 == 1: print "1 é igual a 1" if not 1 == 2: print "1 é diferente de 2" if True: print "Bloco True executado" if False: print "Bloco False não será executado"
Várias condições podem ser encadeadas por meio do elif. Caso a condição do if não seja verdadeira, o primeiro elif será testado e assim sucessivamente, até que a primeira condição elif seja verdadeira. Exemplo (script elif.py): # -*- coding: utf-8 -*if False: print "Bloco IF não será executado" elif 1 == 2: print "Bloco ELIF não será executado" elif True: print "Bloco ELIF 2 executado" elif True: print "Bloco ELIF 3 não será executado, pois o ELIF 2 é verdadeiro"
O else é usado caso a condição do if e de todos os elif não seja verdadeira. Exemplo (script else.py): # -*- coding: utf-8 -*if False: print "Bloco IF não será executado" elif 1 == 2: print "Bloco ELIF não será executado" elif True and False: print "Bloco ELIF 2 não será executado" else: print "Bloco ELSE executado"
36
Python para Pentest
1.6 Funções Uma função é um conjunto de instruções que efetuam uma tarefa em específica. Para criar uma função, utilize a palavra reservada def. Exemplo (script funcao.py): # -*- coding: utf-8 -*def imprime(): print "Função IMPRIME" def imprime_nome(nome): print "A variável NOME recebe como valor o argumento da função IMPRIME_NOME " print "O meu nome é:", nome def soma(a,b): print "Funções podem retornar valores. Nesse caso, a soma de a + b" return a + b print "O bloco após o RETURN nunca é executado " imprime() # Executa a função IMPRIME imprime_nome("Daniel Moreno") # Executa a função IMPRIME_NOME somatorio = soma(1,2) # A variável SOMATORIO amazenará o valor 3 print somatorio
Ao criar funções, as variáveis criadas dentro dela são chamadas de variáveis locais, pois são usadas apenas dentro da própria função. Exemplo (script funcao2.py): def altera_num(): num = 10 num = 2 altera_num() print "Valor de num:", num
Para alterar o valor de alguma variável que esteja fora de uma função, utilize a instrução global. Exemplo (script funcao3.py): def altera_num(): global num num = 10 num = 2
Capítulo 1 ■ Introdução ao Python
37
altera_num() print "Valor de num:", num
1.7 Exceções Ao tentar realizar alguma operação que o interpretador Python não consiga processar, será gerada uma exceção. Exemplos: tentar dividir um número por 0, converter um texto qualquer para inteiro, acessar um índice inválido em uma lista etc. Exemplo (script excecao.py – será gerado uma exceção do tipo IndexError): # -*lista print print
coding: utf-8 -*= [1,2,3,4] lista[4] "Essa linha não será executada, pois foi gerada uma exceção na linha anterior"
Para capturar exceções, o código deve estar em um bloco try-except. Exemplo (script excecao2.py): # -*- coding: utf-8 -*lista = [1,2,3,4] try: print lista[4] print "Executado caso todas as linhas anteriores forem executadas" except: print "Executado caso tenha sido gerada qualquer exceção no bloco TRY"
O else, do bloco try-except-else, é executado caso o except não o seja e o finally é executado independentemente do except ou else serem ou não executados. Exemplo (script excecao3.py): # -*- coding: utf-8 -*lista = [1,2,3,4] try: print lista[0] print "Executado caso todas as linhas anteriores forem executadas" except: print "Executado caso tenha sido gerado qualquer exceção no bloco TRY"
38
Python para Pentest else: print "Executado caso o EXCEPT não tenha sido executado" finally: print "O FINALLY sempre será executado "
Exceções podem ser especificadas. Exemplo (script excecao4.py): # -*- coding: utf-8 -*lista = [1,2,3,4] try: valor = input("Digite 1 ou 2: ") if valor == 1: print lista[4] elif valor == 2: 1/0 else: print "Apenas 1 ou 2" exit() # Sai do programa except IndexError: print "Exceção do tipo IndexError" except ZeroDivisionError: print "Exceção do tipo ZeroDivisionError"
Várias exceções podem ser capturadas em um mesmo bloco. Exemplo (script excecao5.py): # -*- coding: utf-8 -*lista = [1,2,3,4] try: valor = input("Digite 1 ou 2: ") if valor == 1: print lista[4] elif valor == 2: 1/0 else: print "Apenas 1 ou 2" exit() # Sai do programa except (IndexError, ZeroDivisionError): print "Exceção do tipo IndexError ou ZeroDivisionError"
Capítulo 1 ■ Introdução ao Python
39
Detalhes da exceção podem ser capturados em forma de string. Exemplo (script excecao6.py): lista = [1,2,3,4] try: print lista[4] except Exception as e: print e
Para capturar exceções genéricas. Exemplo (script excecao7.py): # -*- coding: utf-8 -*lista = [1,2,3,4] try: print lista[4] except: # O PASS indica ao interpretador Python não fazer nada pass
Outra forma (script excecao8.py): # -*- coding: utf-8 -*lista = [1,2,3,4] try: print lista[4] except Exception: # O PASS indica ao interpretador Python não fazer nada pass
Para forçar o Python a gerar uma exceção, utilize o raise. Exemplo (script excecao9.py): # -*- coding: utf-8 -*try: raise ZeroDivisionError except ZeroDivisionError: print "RAISE forçou exceção tipo ZeroDivisionError, sendo capturado pelo EXCEPT"
40
Python para Pentest
1.8 Entrada, saída de dados e comentários Sempre que algum dado deva ser exibido na tela, utilize o print. Caso os dados precisem ser capturados, utilize o input() ou raw_input(). Os comentários são feitos após o sinal de #. Exemplo (script entrada_saida.py): # -*- coding: utf-8 -*print "O texto será ecoado na tela" # O INPUT() é usado somente para entrada de números numero = input("Digite um número: ") # O RAW_INPUT() é usado somente para entrada de strings # Caso seja digitado um número, o mesmo será do tipo string texto = raw_input("Digite um texto: ") print type(numero) print type(texto)
1.9 Arquivos Para abrir um arquivo externo ao Python (texto ou binário) utilize o with. Há três modos de abertura de arquivos (Tabela 1.9). Tabela 1.9 – Principais modos de abertura de arquivos Modo
Significado
r
Leitura.
w
Escrita (o conteúdo novo sobrescreve o conteúdo antigo).
a
Escrita (o conteúdo novo será acoplado ao conteúdo antigo).
Exemplos (os arquivos devem ser documentos de texto simples): • Modo leitura (script arquivo.py): # -*- coding: utf-8 -*with open("arquivo.txt", "r") as arquivo: # O método READ() lê o conteúdo do arquivo print arquivo.read()
Capítulo 1 ■ Introdução ao Python
41
• Outra forma (script arquivo2.py): with open("arquivo.txt") as arquivo: print arquivo.read()
• Modo gravação (script arquivo3.py): # -*- coding: utf-8 -*with open("arquivo.txt", "w") as arquivo: # O método WRITE() grava o conteúdo no arquivo arquivo.write("O conteúdo antigo será sobrescrito")
• Modo gravação (script arquivo4.py): # -*- coding: utf-8 -*with open("arquivo.txt", "a") as arquivo: arquivo.write("O conteúdo antigo será mantido. O novo conteúdo será acoplado")
Ao trabalhar com arquivos binários, utilize o subfixo b após o modo de abertura (rb, wb). Exemplos: • Modo leitura (script arquivo5.py): with open("arquivo.exe", "rb") as arquivo: conteudo = arquivo.read()
• Modo gravação (script arquivo6.py): with open("arquivo.exe", "rb") as arquivo: conteudo = arquivo.read() with open("COPIA_arquivo.exe", "wb") as arquivo: arquivo.write(conteudo)
1.10 Importação Para importar um arquivo utilize o import. Dessa forma, todas as funções, variáveis, classes do arquivo importado serão acessíveis de dentro do script que o importou.
42
Python para Pentest
Exemplo (script importada.py): # -*- coding: utf-8 -*def teste(): print "Função importada" texto = "Variável importada"
Para que a função teste e a variável texto sejam acessíveis em outros scripts Python, utilize o import (o script importa2.py deve estar no mesmo diretório do script importada.py): # -*- coding: utf-8 -*import importada # Para acessar a função TESTE digite o nome do arquivo seguido de um ponto importa.teste() # Para acessar a variável TEXTO digite o nome do arquivo seguido de um ponto print importa.texto
Execute o script importa2.py: root@kali# python importa2.py Função importada Variável importada
Outra forma de importar scripts é usando from script_python import *. Dessa forma, embora não seja recomendável, o script é importado e não é necessário preceder o nome da função (variável ou classe) com o nome do arquivo seguido de ponto (o script importa3.py deve estar no mesmo diretório do script importada.py): # -*- coding: utf-8 -*from importada import * # Não precisa preceder o nome da função com o nome do script seguido de ponto teste() # Não precisa preceder o nome da variável com o nome do script seguido de ponto print texto # Caso seja criada uma função com nome TESTE, a função importada TESTE é sobrescrita # Por isso não se recomenda utilizar FROM SCRIPT IMPORT * def teste(): print "Função local sobrescreve a função importada" teste()
Capítulo 1 ■ Introdução ao Python
43
Execute o script importa3.py: root@kali# python importa3.py Função importada Variável importada Função local sobrescreve a função importada
1.11 Classes As classes em Python são criadas por meio do class. Exemplo (script classe.py): class Pessoa: def __init__(self, nome, sobrenome): ❶ self.nome = nome ❷ self.sobrenome = sobrenome ❸ def imprime_nome_completo(self): return self.nome + self.sobrenome class Generico(Pessoa): ❹ def altera_nome(self): ❺ self.nome = self.sobrenome daniel = Pessoa("Daniel", "Moreno") ❻ print daniel.nome ❼ print daniel.sobrenome ❽ print daniel.imprime_nome_completo() ❾ bla = Generico("Nome", "Qualquer") ❿ bla.altera_nome() print bla.nome print bla.sobrenome print bla.imprime_nome_completo() ⓫
A função __init__ é uma função especial que é executada no momento em que a classe é invocada (linha ❻). Qualquer função dentro de uma classe é chamada de método. A variável self representa o próprio objeto (variável daniel – linha ❻) e as variáveis nome e sobrenome irão armazenar o nome e o sobrenome (linha ❶). self.nome e self.sobrenome são atributos (linhas ❷ e ❸). Para acessá-los basta usar o
nome do objeto seguido de ponto e o nome do atributo (linhas ❼ e ❽).
44
Python para Pentest
O método imprime_nome_completo retorna o nome e o sobrenome aglutinados. Para acessá-lo basta usar o nome do objeto seguido de ponto e o nome do método (linha ❾). A classe Generico é uma classe herdada de Pessoa (linha ❹). Dessa forma, é possível acessar atributos e métodos da classe Pessoa. O método altera_nome sobrescreve o conteúdo do atributo nome (linha ❺). Devido à classe Generico ser herdada da classe Pessoa, o objeto criado deve ter um nome e um sobrenome (linha ❿. Também é possível acessar os métodos da classe Pessoa (linha ⓫).
1.12 Codificação UTF-8 Sempre que caracteres especiais (ç, ã é etc.) devam ser exibidos na tela ou usados no meio de comentários informe ao script Python o tipo de codificação a ser usada na primeira linha do script. Exemplo (script utf.py): # -*- coding: utf-8 -*# A primeira linha informa ao Python que é utilizada a codificação UTF-8 # Dessa forma é possível utilizar caracteres especiais em comentários e no PRINT print "Codificação UTF-8: ç ã é í"