Cómo evitar que una entrada estándar que no se ajuste al búfer se envíe al shell en el ensamblaje Intel de 64 bits de Linux (x86-64)

Editar: Título cambiado, como @Gunner señaló que esto no es un desbordamiento de búfer.

Al leer la entrada del usuario destdin conNR_read en el ensamblaje de Intel de 64 bits de Linux, me pregunto cómo puedo evitar que la entrada que no encaja en el búfer de entrada se envíe al shell de Linux, por ejemplo. ¿golpetazo? Por ejemplo, en este programa de ejemplo, he definido un búfer de entrada de 255 bytes (el tamaño del búfer puede ser lo que sea> = 1). El resto de una entrada de más de 255 bytes se envía a bash (si se ejecuta desde bash) y esto es obviamente una vulnerabilidad grave. ¿Cómo se debe leer la entrada en el ensamblaje de Linux de 64 bits para evitar esta vulnerabilidad?

Aquí está mi código:

[bits 64]

section .text
global _start

; can be compiled eg. with nasm or yasm.
; nasm:
; nasm -f elf64 read_stdin_64.asm; ld read_stdin_64.o -o read_stdin_64
; yasm:
; yasm -f elf64 -m amd64 read_stdin_64.asm -o read_stdin_64.o; ld read_stdin_64.o -o read_stdin_64

NR_read     equ 0
NR_exit     equ 60

STDIN       equ 1

; input:
; rax   number of syscall
; rdi   parameter 1
; rsi   parameter 2
; rdx   parameter 3
; r10   parameter 4
; r8    parameter 5
; r9    parameter 6
;
; output:
; rax   syscall's output
@do_syscall:
    push    rcx
    push    r11
    syscall      ; 64-bit syscall, overwrites rcx and r11
    pop     r11  ; syscall's return value in rax
    pop     rcx
    ret

@read_stdin:
    push    rdi
    push    rsi
    push    rdx
    mov     rdi,STDIN                ; file handle to read. STDIN = 1.
    lea     rsi,[input_buffer]
    mov     rdx,input_buffer_length  ; length of string
    mov     rax,NR_read              ; number of syscall (0)
    call    @do_syscall
    sub     rax,1                    ; get the number of writable characters.
    pop     rdx
    pop     rsi
    pop     rdi
    ret

_start:     ; linker entry point
    call    @read_stdin

@end_program:
    xor     rdi,rdi
    mov     rax,NR_exit  ; number of syscall (60)
    syscall

section .data

input_buffer         times 255 db 0
input_buffer_length  equ $-input_buffer

Respuestas a la pregunta(3)

Su respuesta a la pregunta