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으로 정상 종료.
반응형