0% acharam este documento útil (0 voto)
35 visualizações2 páginas

Shellcoding Cheat Sheet - v1

Este documento fornece um guia rápido sobre shellcoding, listando instruções assembly comuns, registradores de CPU e seus usos, e comandos úteis do debugger GDB. Ele também descreve técnicas como montar código assembly em shellcode e testá-lo usando uma ferramenta shellcode tester.

Enviado por

tsth4ck
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
35 visualizações2 páginas

Shellcoding Cheat Sheet - v1

Este documento fornece um guia rápido sobre shellcoding, listando instruções assembly comuns, registradores de CPU e seus usos, e comandos úteis do debugger GDB. Ele também descreve técnicas como montar código assembly em shellcode e testá-lo usando uma ferramenta shellcode tester.

Enviado por

tsth4ck
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 2

Shellcoding Cheat sheet

Principais instruções Assembly Excluindo Breakpoints


Introdução Instrução Função (gdb) del 1
Este é um guia rápido de consulta para criação de shellcode (gdb) del
Criado por Hélvio Junior (M4v3r1ck) INT3 Software breakpoint Disasemble
CALL Chama função (gdb) disassemble main
Registradores 32 bits CLD Limpa a Direction Flag (gdb) disassemble/r main
32 bits 16 bits 8 bits DEC Decrementa em 01 o registrador indicado (gdb) disassemble 0x000011e9,+100
High Low INC Incrementa em 01 o registrador indicado
JMP Salta para endereço especificado Conteúdos dos registradores
eax ax ah al
LEA Calcula endereço efetivo (gdb) info registers
ecx cx ch cl
MOV Copia informação (gdb) info registers eax
edx dx dh dl
ebx bx bh bl NOP Sem operação (Não faz nada)
Visualiza struct
esp sp -- spl Remove do topo da pilha e insere em um
POP (gdb) ptype struct [nome_da_struct]
ebp bp -- bpl registrador
(gdb) ptype struct sockaddr_in
esi si -- sil PUSH Insere dados no topo da pilha
(gdb) ptype/o struct [nome_da_struct]
edi di -- dil RET Sai de uma função
SHL Deslocamento de bits a esquerda Visualiza dados de uma posição de memória
SHR Deslocamento de bits a direita (gdb) print &nome_variavel
Registradores 64 bits XOR Operação XOR entre os registradores (gdb) print 0x01020304
64 bits 32 bits 16 bits 8 bits
High Low Visualiza dados de uma posição de memória com parse de struct
Comandos GDB (gdb) print/x *(struct sockaddr_in *) &nome_variavel
rax / r0 eax / r0d ax / r0w ah al / r0b
rcx / r1 ecx / r1d cx / r1w ch cl / r1b Abrindo aplicação no GDB (gdb) print/x *(struct sockaddr_in *) 0x01020304
rdx / r2 edx / r2d dx / r2w dh dl / r2b # gdb [path_da_aplicação] Verificando proteções
rbx / r3 ebx / r3d bx / r3w bh bl / r3b
Abrindo aplicação com seu coredump (gdb) checksec
rsp / r4 esp / r4d sp / r4w -- spl / r4b
rbp / r5 ebp / r5d bp / r5w -- bpl / r5b # gdb [path_da_aplicação] [path_core_dump]
rsi / r6 esi / r6d si / r6w -- sil / r6b Shellcode Tester Linux
HELP
rdi / r7 edi / r7d di / r7w -- dil / r7b (gdb) help [comando] Instalando
r8 r8d r8w -- r8b (gdb) help run # git clone https://github.com/helviojunior/shellcodetester.git
r9 r9d r9w -- r9b # cd shellcodetester/Linux
r10 r10d r10w -- r10b Rodando aplicação sem parâmetro
# make
r11 r11d r11w -- r11b (gdb) run
r12 r12d r12w -- r12b Assemblando (montando) utilizando shellcode tester Linux
Rodando aplicação com parâmetro
r13 r13d r13w -- r13b # shellcodetester arquivo.asm
(gdb) run AAAAA
r14 r14d r14w -- r14b # shellcodetester arquivo.asm --break-point
r15 r15d r15w -- r15b Rodando aplicação com parâmetro vindo de um comando externo
(gdb) run <(echo -n “AAAA”) ASM 32 bits para shellcode
IP – Instruction Pointer (gdb) run <(python -c 'print "CHALLENGE " + "A" * 500 ')
[BITS 32]
Endereço da próxima instrução a ser executada Rodando aplicação recebendo dados via stdin vindo de um global _start
ip 16 bits comando externo section .text
eip 32 bits (gdb) run < <(echo -n “AAAA”) _start:
; Instrucoes
rip 64 bits (gdb) run < <(python -c 'print "CHALLENGE " + "A" * 500 ')
Adicionando breakpoint
SP – Stack Pointer ASM 64 bits para shellcode
(gdb) b *main
Armazena o endereço de memória que aponta para o topo da Para 64 bits alterar a primeira linha para [BITS 64]
(gdb) b *0x01020304
pilha (stack)
sp 16 bits Listando Breakpoints
esp 32 bits (gdb) info breakpoints
rsp 64 bits

Versão 1.0 gerado em 2020-07-29


Shellcoding Cheat sheet
Assemblando (montando) ASM para shellcode ASM Tecnica JMP, CALL, POP Linux e Windows 64 bits
Registrador Função
Montando arquivo [BITS 32]
# nasm arquivo.asm -o arquivo.o global _start
RCX Primeiro parâmetro
section .text
Opcodes em formato hexa _start: RDX Segundo parâmetro
# cat arquivo.o | msfvenom -p - -a x86 --platform win -e jmp step1 R8 Terceiro parâmetro
step2: R9 Quarto parâmetro
generic/none -f hex pop ecx ; Salva o endereço do texto em ECX
nop ESP + 0x00 Quinto parâmetro
Opcodes em formato python ; Continua as instrucoes ESP + 0x04 Sexto parâmetro
# cat arquivo.o | msfvenom -p - -a x86 --platform win -e step1: …
generic/none -f python call step2
db "Treinamento Shellcoding", 0x0a, 0x00 Pseudo code: func1(int a, int b, int c, int d, int e);
Onde: a em RCX, b em RDX, c em R8, d em R9, e adicionado na
ASM para geração ELF Linux pilha
Em Linux não há alteração no ASM, sendo assim utilizar o mesmo Passagem de parâmetros em chamada de função
dos exemplos acima. AMD64 Application Binary Interface (ABI) - Calling
Syscall Linux 32 bits
Registrador Função convention defaults
ASM 32 bits para geração PE Windows • Alinhamento
EAX Numero do System Call o Pilha necessita estar alinhada a 16 bytes
[BITS 32]
global WinMain EBX Primeiro parâmetro • Passagem de parâmetros
section .text ECX Segundo parâmetro o RCX, RDX, R8, R9, o restante na pilha
WinMain:
EDX Terceiro parâmetro • Shadow store
; Instrucoes
ESI Quarto parâmetro o Criação de uma área vazia na pilha com a correspondência
EDI Quinto parâmetro de um-para-um da quantidade de parâmetros da função
ASM 64 bits para geração PE Windows Pseudo code: Func1(ebx, ecx, edx, esi, edi) que está sendo chamada
Para 64 bits alterar a primeira linha para [BITS 64] • Retorno de valores
o Quando há retorno o valor e/ou ponteiro é salvo no
Syscall Linux 64 bits registrador RAX
Assemblando (montando) ASM para execução Registrador Função
Linux 32 bits ASM 64 bits – instruções de exemplo
RAX Número do System Call
# nasm -f elf32 arquivo.asm -o arquivo.o
RDI Primeiro parâmetro
# ld -o arquivo arquivo.o -m elf_i386 cld; Limpa a flag de direção
RSI Segundo parâmetro
Linux 64 bits RDX Terceiro parâmetro and rsp, 0xFFFFFFFFFFFFFFF0 ; Alinhamento em 16 bytes
na pilha
# nasm -f elf64 arquivo.asm -o arquivo.o R10 Quarto parâmetro
# ld -o arquivo arquivo.o -m elf_x86_64 R8 Quinto parâmetro xor eax,eax ; zera EAX
R9 Sexto parâmetro push eax ; Coloca 1 shadow store na pilha
Windows 32 bits
Pseudo code: Func1(rdi, rsi, rdx, r10, r8, r9)
# nasm -f win32 arquivo.asm -o arquivo.o
# gcc -o arquivo.exe arquivo.o Simbolos de debug
Linux e Windows 32 bits (Stack)
Windows 64 bits Extraindo de uma aplicação
Registrador Função
# nasm -f win64 arquivo.asm -o arquivo.o # objcopy --only-keep-debug [arquivo_elf] simbolos.debug
# gcc -o arquivo.exe arquivo.o
ESP + 0x00 Primeiro parâmetro Utilizando simbolos dentro do GDB
ESP + 0x04 Segundo parâmetro (gdb) symbol-file simbolos.debug
Texto em ordem reversa e print Hexa utilizando python ESP + 0x08 Terceiro parâmetro
texto = "Treinamento Shellcoding\n" ESP + 0x0C Quarto parâmetro
texto[::-1] ESP + 0x10 Quinto parâmetro
len(texto[::-1]) ESP + 0x14 Sexto parâmetro
texto[::-1].encode('hex') ...
Pseudo code: Func1(ESP, ESP + 0x04, ESP + 0x08, ...)

Versão 1.0 gerado em 2020-07-29

Você também pode gostar