편집 : @Gunner가 버퍼 오버플로가 아님을 지적하여 바뀜 .버퍼에 맞지 않는 stdin 입력을 피하는 방법 Linux 64 비트 Intel (x86-64) 어셈블리의 쉘로 보내려면
Linux 64 비트 인텔 어셈블리에서 에서 NR_read
으로 사용자 입력을 읽는 중 입력 버퍼가 Linux 셸에 전송되는 것과 맞지 않는 입력을 피할 수 있을지 궁금합니다. 세게 때리다? 예를 들어,이 예제 프로그램에서는 255 바이트의 입력 버퍼를 정의했습니다 (버퍼의 크기는 1 이상이 될 수 있습니다). 255 바이트보다 긴 나머지 입력은 bash (bash에서 실행중인 경우)로 전송되며 이것은 심각한 심각한 취약점입니다. 이 취약점을 피하기 위해 Linux 64 비트 어셈블리에서 입력을 어떻게 읽어야합니까? 개행 문자가 발견 될 때까지
[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
huh? 'input_buffer_length'를 넘겨 주면 버퍼 크기를 초과하지 않도록해야한다. –
@ J-16SDiZ'input_buffer_length'는 내 프로그램에서 읽을 바이트 수만을 제한합니다. 나머지 입력은 Linux 쉘로 이동합니다. 배쉬하고 사형 당해서, 그게 내가 피하려고하는거야. 도스에서 키보드와 관련된 대부분의 문제는 키보드 인터럽트를 연결하고 커스텀 키보드 인터럽트를 사용하여 처리 할 수 있습니다.하지만 그것은 Linux에서 올바른 방법이 아닌 것처럼 보입니다 (또는 루트가 아닌 프로그램에서도 가능합니까?). . – nrz
오, 돌아 오기 전에 나머지 스팀을 제거하는 방법을 묻습니다. 읽기를 제한하는 방법이 아닙니다. –