So vermeiden Sie, dass stdin-Eingaben, die nicht in den Puffer passen, in einer 64-Bit-Intel-Assembly (x86-64) für Linux an die Shell gesendet werden

Bearbeiten: Titel geändert, als @Gunner darauf hinwies, dass dies kein Pufferüberlauf ist.

Beim Lesen von Benutzereingaben ausstdin mitNR_read In der 64-Bit-Linux-Intel-Assembly frage ich mich, wie ich vermeiden kann, dass die Eingabe, die nicht in den Eingabepuffer passt, an die Linux-Shell gesendet wird, z. Bash? Zum Beispiel habe ich in diesem Beispielprogramm einen Eingabepuffer von 255 Bytes definiert (die Größe des Puffers kann beliebig sein> = 1). Der Rest einer Eingabe, die länger als 255 Byte ist, wird an bash gesendet (wenn von bash ausgeführt), und dies ist offensichtlich eine schwerwiegende Sicherheitsanfälligkeit. Wie sollten Eingaben in der 64-Bit-Assembly von Linux gelesen werden, um diese Sicherheitsanfälligkeit zu vermeiden?

Hier ist mein Code:

[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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage