Ret2lib + Printf leak - arm64
Ret2lib - Bypass NX com ROP (sem ASLR)
Compile sem canário:
Encontrar offset
offset x30
Criando um padrão com pattern create 200
, usando-o e verificando o offset com pattern search $x30
, podemos ver que o offset é 108
(0x6c).
Dando uma olhada na função main desmontada, podemos ver que gostaríamos de pular para a instrução que pula para printf
diretamente, cujo offset de onde o binário é carregado é 0x860
:
Encontrar sistema e string /bin/sh
/bin/sh
Como o ASLR está desativado, os endereços sempre serão os mesmos:
Encontrar Gadgets
Precisamos ter em x0
o endereço da string /bin/sh
e chamar system
.
Usando rooper, um gadget interessante foi encontrado:
Este gadget carregará x0
de $sp + 0x18
e então carregará os endereços x29 e x30 de sp e pulará para x30. Assim, com este gadget, podemos controlar o primeiro argumento e então pular para system.
Exploit
Ret2lib - Bypass de NX, ASL e PIE com vazamentos de printf da pilha
Compile sem canário:
PIE e ASLR, mas sem canário
Rodada 1:
Vazamento de PIE da pilha
Abusar do bof para voltar ao main
Rodada 2:
Vazamento de libc da pilha
ROP: ret2system
Vazamentos do Printf
Definindo um ponto de interrupção antes de chamar printf, é possível ver que há endereços para retornar ao binário na pilha e também endereços da libc:
Tentando diferentes offsets, o %21$p
pode vazar um endereço binário (bypass de PIE) e %25$p
pode vazar um endereço da libc:
Subtraindo o endereço da libc vazado com o endereço base da libc, é possível ver que o offset do endereço vazado em relação à base é 0x49c40
.
Offset x30
Veja o exemplo anterior, pois o bof é o mesmo.
Encontrar Gadgets
Como no exemplo anterior, precisamos ter em x0
o endereço da string /bin/sh
e chamar system
.
Usando rooper, outro gadget interessante foi encontrado:
Este gadget carregará x0
de $sp + 0x78
e então carregará os endereços x29 e x30 de sp e saltará para x30. Assim, com este gadget, podemos controlar o primeiro argumento e então saltar para system.
Exploit
Last updated