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