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

Arquivo
Descrição

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: 0x401401

Inicialmente é 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).

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:

Flag

DawgCTF{C0ngR4tul4t10ns_d15c1p13_y0u_4r3_r34dy_2_pwn!}

Autor da WriteUp

Membro de Exploitation - HenriUz

Atualizado