Asm 명령어 중에 Syscall 이라는 명령어가 있다.
Syscall 명령어는 x86-64 아키텍처 기준으로, rax, rdi, rsi, rdx 총 4가지 레지스터의 정보를 통해 여러 함수를 실행한다.
(몇몇의 syscall 명령어는 더 많은 레지스터를 사용하기도 한다.)
우선적으로, rax 레지스터의 값으로 어떤 함수를 실행할지 결정하게 되는데, 각 값에 따른 함수의 종류는 아래 링크에 정리되어 있다.
https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md
여기서 가장 많이 사용되는 syscall 들은 다음과 같다.
Number | Syscall | %rax | %rdi | %rsi | %rdx |
0 | read | 0x00 | unsigned int fd | char *buf | size_t count |
1 | write | 0x01 | unsigned int fd | const char *buf | size_t count |
2 | open | 0x02 | const char *filename | int flags | umode_t mode |
15 | rt_sigreturn | 0x0f | ? | ? | ? |
59 | execve | 0x3b | const char *filename | const char *const *argv | const char *const *envp |
각 함수의 기능을 정리하자면
NO.0 Read (입력)
rax = 0x0
rdi = fd, 보통 값은 0을 쓴다.
rsi = buf, 입력값을 저장할 버퍼의 주소
rdx = count, 입력할 데이터의 크기
NO.1 Write (출력)
rax = 0x1
rdi = fd, 보통 값은 1을 쓴다.
rsi = buf, 출력할 데이터가 저장된 버퍼의 주소
rdx = count, 출력할 데이터의 길이
NO.2 Open (외부의 파일 연결)
rax = 0x2
rdi = filename, 읽어들일 파일의 위치 및 이름
rsi = flags, 파일을 읽기전용, 읽기쓰기전용 등등으로 설정해준다.
rdx = mode, 파일의 액세스 권한을 설정한다.
NO.15 Rt_Sigreturn (SIGALRM - 이후 SROP 기법에서 사용된다.)
rax = 0xf
rdi = ?, 함수가 실행되는 순간 모든 레지스터의 값을 저장하고 커널로 돌아갔다온다.
rsi = ?, 위와 같음
rdx = ?, 위와 같음
NO.59 Execve (커맨드 실행)
rax = 0x3b
rdi = filename, 터미널에서 실행할 문자열
rsi = argv, 쉘 획득을 목적으로 사용할 경우 0으로 설정
rdx = envp, 위와 같음
기초 Pwn 공부를 시작하게 되면 적어도 read, write, execve의 table은 익숙해 지는것이 좋다.
추후 Return-Orientied-Programming(ROP) 기법을 공부하며 계속 사용하게 될 것이다.
'Pwnable' 카테고리의 다른 글
[Pwnable] Return Oriented Programming (0) | 2023.12.08 |
---|