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