Security

register & system call

이무쿤 2021. 11. 26. 15:41
반응형
  • 레지스터는 명령을 수행하기 위해 필요한 데이터를 담는 저장소
  • x64 레지스터는 r, x32 레지스터는 e로 시작하는 포맷
데이터 레지스터
rax : 시스템 콜의 실질적인 번호를 가르킴 / 함수의 실행 결과가 담김
rbx (베이스 레지스터) : 메모리 주소를 지정할 때 사용
rcx (카운터 레지스터) : 반복문 카운트 값을 지정할 떄 사용
rdx (데이터 레지스터) : 큰 범위의 값을 연산할 떄 , rax와 함께 많이 사용
포인터 레지스터
rsi : 메모리 값을 이동하거나 비교할 때, 출발지 주소 지정
rdi : 메모리 값을 이동하거나 비교할 때, 목적지 주소 지정
rbp : 스택의 시작점
rsp : 스택의 꼭대기 (명령이 삽입 삭제되면서 값이 변함)

기타 함수의 매개변수 : r8 ~ r15

rax의 값을 통해 system call 호출

  • rax의 특정 값이 들어가면 그에 맞는 system call이 호출 됨
  • 파라미터로 지정된 레지스터도 그에 맞는 역할을 수행함

리눅스 시스템 콜 테이블  http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/

 

Linux System Call Table for x86 64 · Ryan A. Chapman

Linux 4.7 (pulled from github.com/torvalds/linux on Jul 20 2016), x86_64 Note: 64-bit x86 uses syscall instead of interrupt 0x80. The result value will be in %rax To find the implementation of a system call, grep the kernel tree for SYSCALL_DEFINE.\?(sysca

blog.rchapman.org

c나 자바보다 훨씬 빠른 프로그램 작성 가능

어셈블리 코드

section .data
	msg db "Hello World"
section .text
	global_start
_start:
	mov rax, 1
        mov rdi, 1
        mov rsi, msg
        mov rdx, 12
        syscall
        mov rax, 60
        mov rdi, 0
        syscall

해석

  • rax에 1을 넣으면서 sys_write system call 호출
  • rdi 1로 fd 지정 (stdout)
  • rsi에는 buf 값이 들어가므로 data 영역 (배열 저장 가능)에 저장한 문자열 지정
  • rdx에는 문자열 길이 지정
  • syscall 하면 "Hello World"가 화면에 출력됨.
  • rax에 60 넣으면 sys_exit 호출
  • rdi에 error값 0으로 정상 종료.
반응형