64 bits in my Ark and Texture
Descrição do Desafio:
Categoria: pwn Descrição:
Can you pwn it? No libc or system needed. Just good ol, 64 bit binary exploitation.
Arquivos
64bits
Executável.
solve.py
Script.
📥 Download: Arquivos
Passo a Passo da Solução
1. Análise do arquivo fornecido
O desafio nos fornece apenas um executável. Ao executá-lo, o programa apresenta a seguinte interface:
=========== Welcome to the Exploitation Dojo ==============
You must first prove your knowledge if you want access to my secrets
Question 1: In an x86-64 Linux architecture, a function reads its arguments from the stack, left-to-right. True or False?
[1] True
[2] False
> 2
Correct!
Question 2: In an x86-64 Linux architecture, which register holds the first integer or pointer argument to a function?
[1] RDI
[2] RSI
[3] RAX
[4] RCX
> 1
Correct!
Question 3: In an x86-64 Linux architecture, where is the return value of a function typically stored?
[1] RDX
[2] RSP
[3] RBP
[4] RAX
> 4
Correct!
You may have passed my test but I must see you display your knowledge before you can access my secrets
Lesson 1: For your first challenge you have to simply jump to the function at this address: 0x401401Inicialmente é nos apresentado 3 perguntas simples, e após responder elas, o código pede para retornarmos para o endereço 0x401401. Analisando essa função pelo Ghidra, vemos que é bem isso mesmo, ele nos informa o endereço da função win1() (que sempre será o mesmo pela falta da proteção PIE) e fornece um meio de estourarmos a pilha.
Olhando pelo GDB, a quantidade de bytes necessários para chegar no endereço de retorno é 0x98. Analisando a função win1(), vemos que o objetivo é o mesmo, porém agora devemos pular para a win2() passando como parâmetro o valor 0xDEADBEEF.
Para isso iremos precisar de um gadget pop rdi, que é fornecido no código.
Não tem muito segredo agora, a win2() verifica se o parâmetro está correto e pede para pularmos para a win3() passando 3 parâmetros (cujos gadgets necessários são fornecidos no código).
Importante: Todas as funções win imprimem um pedaço da flag.
2. Exploit
O exploit é simples, devemos apenas realizar um ROP, nos preocupando em pegar os pedaços da flag.
Com isso obtemos o seguinte resultado:
Importante: atente-se ao alinhamento da pilha, em exploits de ROP muitas vezes acabamos deixando a pilha desalinhada (no caso, ela não está alinhada em 16 bytes, fazendo com que os endereços não terminem todos em 0). Para resolvermos isso de forma simples, podemos colocar um simples gadget de RET antes do endereço de retorno. Na solução, todos os payloads estão com a instrução p64(0x401400) antes do endereço de retorno real.
Flag
DawgCTF{C0ngR4tul4t10ns_d15c1p13_y0u_4r3_r34dy_2_pwn!}
Autor da WriteUp
Atualizado