Exploiting Tools
Metasploit
Shellcodes
GDB
Instalação
Parâmetros
Instruções
Você poderia opcionalmente usar este fork do GEF que contém instruções mais interessantes.
Truques
Mesmos endereços no GDB
Durante a depuração, o GDB terá endereços ligeiramente diferentes dos utilizados pelo binário quando executado. Você pode fazer com que o GDB tenha os mesmos endereços fazendo o seguinte:
unset env LINES
unset env COLUMNS
set env _=<caminho>
Coloque o caminho absoluto para o binárioExplorar o binário usando o mesmo caminho absoluto
PWD
eOLDPWD
devem ser os mesmos ao usar o GDB e ao explorar o binário
Rastrear para encontrar funções chamadas
Quando você tem um binário vinculado estaticamente, todas as funções pertencerão ao binário (e não a bibliotecas externas). Neste caso, será difícil identificar o fluxo que o binário segue para, por exemplo, solicitar entrada do usuário.
Você pode identificar facilmente esse fluxo executando o binário com gdb até ser solicitado a inserir dados. Em seguida, pare com CTRL+C e use o comando bt
(backtrace) para ver as funções chamadas:
Servidor GDB
gdbserver --multi 0.0.0.0:23947
(no IDA você precisa preencher o caminho absoluto do executável na máquina Linux e na máquina Windows)
Ghidra
Encontrar o deslocamento da pilha
Ghidra é muito útil para encontrar o deslocamento para uma sobreposição de buffer graças às informações sobre a posição das variáveis locais.
Por exemplo, no exemplo abaixo, um fluxo de buffer em local_bc
indica que você precisa de um deslocamento de 0xbc
. Além disso, se local_10
for um cookie canário, indica que para sobrescrevê-lo a partir de local_bc
há um deslocamento de 0xac
.
Lembre-se de que os primeiros 0x08 de onde o RIP é salvo pertencem ao RBP.
qtool
Obtenha cada opcode executado no programa.
GCC
gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2 --> Compilar sem proteções -o --> Saída -g --> Salvar código (GDB poderá vê-lo) echo 0 > /proc/sys/kernel/randomize_va_space --> Desativar o ASLR no linux
Para compilar um shellcode: nasm -f elf assembly.asm --> retorna um ".o" ld assembly.o -o shellcodeout --> Executável
Objdump
-d --> Desmontar seções executáveis (ver opcodes de um shellcode compilado, encontrar ROP Gadgets, encontrar endereço de função...) -Mintel --> Sintaxe Intel -t --> Tabela de Símbolos -D --> Desmontar tudo (endereço de variável estática) -s -j .dtors --> seção dtors -s -j .got --> seção got -D -s -j .plt --> seção plt descompilada -TR --> Realocações ojdump -t --dynamic-relo ./exec | grep puts --> Endereço de "puts" para modificar em GOT objdump -D ./exec | grep "VAR_NAME" --> Endereço de uma variável estática (armazenadas na seção DATA).
Despejos de núcleo
Execute
ulimit -c unlimited
antes de iniciar meu programaExecute
sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t
sudo gdb --core=<caminho/core> --quiet
Mais
ldd executable | grep libc.so.6 --> Endereço (se ASLR, então isso muda toda vez) for i in `seq 0 20`; do ldd <Ejecutable> | grep libc; done --> Loop para ver se o endereço muda muito readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system --> Deslocamento de "system" strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh --> Deslocamento de "/bin/sh"
strace executable --> Funções chamadas pelo executável rabin2 -i ejecutable --> Endereço de todas as funções
Depurador de imunidade
IDA
Depuração em Linux remoto
Dentro da pasta do IDA, você pode encontrar binários que podem ser usados para depurar um binário dentro de um sistema Linux. Para fazer isso, mova o binário linux_server
ou linux_server64
para o servidor Linux e execute-o dentro da pasta que contém o binário:
Em seguida, configure o depurador: Depurador (remoto linux) --> Opções do processo...:
Last updated