์ค๋ ๋ค๋ฃฐ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ปค๋ ๋ชจ๋์ ์ ์ ๋ชจ๋
- ์์คํ ์ฝ(syscall)์ด๋ ๋ฌด์์ธ๊ฐ? (+syscall๊ณผ call๊ณผ์ ์ฐจ์ด)
- ํ๋ก์์ ๋?
- syscall์ ์๋ฆฌ (x86,x86_64)
์ปค๋, ์ ธ, ์ ์
์ด์์ฒด์ ๋ ์ปดํจํฐ์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ํ๋์จ์ด์ ์ํํธ์จ์ด์ ์ ๊ทผํ ์ ์๋ค. ์ด ๊ถํ์ ๋งค์ฐ ๋ง๊ฐํ๊ธฐ ๋๋ฌธ์ ์ปดํจํฐ๋ ํดํน์ผ๋ก๋ถํฐ ์ด๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ๊ถํ์ ์ปค๋ ๋ชจ๋์ ์ ์ ๋ชจ๋๋ก ๋๋๋ค. ๋ํ ๋ชจ๋๋ง๋ค ์ ๊ทผํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋๋๋ฐ, ์ปค๋ ๋ชจ๋์์๋ ์ปค๋ ๊ณต๊ฐ๊ณผ ์ ์ ๊ณต๊ฐ์, ์ ์ ๋ชจ๋์์๋ ์ ์ ๊ณต๊ฐ๋ง ์ ๊ทผ ํ ์์๋ค.
์ปค๋(Kernel) ๋ชจ๋, ์ปค๋
- ์ปค๋์ ์ ์ ๊ฐ ์ง์ ํ ์ ์๋ ์ ์์ค์ ์์ (๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ, ์ ์ถ๋ ฅ, ํ์ผ ์์คํ , ๋คํธ์ํฌ ํต์ ๋ฑ)์ ์คํ
- ์ปค๋์ ์์์ ์ถ์ํํ์ฌ ๊ด๋ฆฌํจ
์๋๋ ์ปค๋์ด ๊ด๋ฆฌํ ๋ฌผ๋ฆฌ์ ์์๊ณผ, ์ด๋ฅผ ์ง์นญํ๋ ์ถ์์ ์์์ ์ด๋ฆ ๊ฐ ๋์ ๊ด๊ณ์ด๋ค!
CPU -> ํ์คํฌ(task)
๋ฉ๋ชจ๋ฆฌ -> ํ์ด์ง(page), ์ธ๊ทธ๋จผํธ(segment)
๋์คํฌ -> ํ์ผ(file)
๋คํธ์ํฌ -> ์์ผ(socket)
์ด์ธ์๋ ์ธ๋ถ์ฅ์น(ํ๋ฆฐํฐ, GPU ๋ฑ)์ ๊ด๋ฆฌํ๋ค~
๊ณง ๋ชจ๋ ๊ฒ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ํด์ปค๊ฐ ์ปค๋ ๋ชจ๋๊น์ง ํ๋ํ๊ฒ ๋๋ฉด ๊ฑฐ์ ๋ฌด๋ฐฉ๋น ์ํ๋ผ๊ณ ํด๋ ๋ฌด๋ฐฉ
์ปค๋์ ์ฆ ์ด์ ์ฒด์ ์ ํต์ฌ
์๋ฅผ ๋ค์ด ์ปค๋์ ์ด๋ค ํ๋ก์ธ์ค๊ฐ ์ด๋ค ์์์ ์์ฒญํ ๋ ๊ถํ์ ๋ฐ๋ผ ์ ๊ทผ ์ ์ด๋ฅผ ํจ. ํ์ง๋ง ๋ง์ฝ ์ปค๋ ๋ชจ๋์์ ์ฝ๋๋ฅผ ๋ง ์กฐ์ํด์ ์ด๋ฅผ ์ฐํํ ์ ์์
์ปค๋์ด ํ๋ ์ผ
ํต์ฌ ๊ธฐ๋ฅ | ์ค๋ช |
ํ๋ก์ธ์ค ๊ด๋ฆฌ | ํ๋ก์ธ์ค์ CPU๋ฅผ ๋ฐฐ๋ถํ๊ณ ์์ ์ ํ์ํ ์ ๋ฐ ํ๊ฒฝ์ ์ ๊ณตํ๋ค. |
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ | ํ๋ก์ธ์ค์ ์์ ๊ณต๊ฐ์ ๋ฐฐ์นํ๊ณ ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ณด๋ค ํฐ ๊ฐ์๊ณต๊ฐ์ ์ ๊ณตํ๋ค. |
ํ์ผ ์์คํ ๊ด๋ฆฌ | ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ ๊ทผํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค. |
์ ์ถ๋ ฅ ๊ด๋ฆฌ | ํ์ํ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค. |
ํ๋ก์ธ์ค ๊ฐ ํต์ ๊ด๋ฆฌ | ๊ณต๋ ์์ ์ ์ํ ๊ฐ ํ๋ก์ธ์ค ๊ฐ ํต์ ํ๊ฒฝ์ ์ง์ํ๋ค. |
์ ์ ๋ชจ๋
- ์ด์ ์ฒด์ ๊ฐ ์ฌ์ฉ์์๊ฒ ๋ถ์ฌํ๋ ๊ถํ.
๋ฃจํธ ์ ์ ์ ๊ถํ๋ ์ ์ ๋ชจ๋์ ํด๋น. ๋ฐ๋ผ์ ์๋ฌด๋ฆฌ ๋ฃจํธ์ ๊ถํ์ ํ์ทจํ๋ค๊ณ ํด๋ ์ปค๋ ๋ชจ๋์ ๋ง๊ฐํ ๊ถํ์ ์คํํ๋ ๋ ๊ฒ์ ๋ง์ ์ ์์
์ ๊ทธ๋ฆผ์์์ฒ๋ผ ์ปค๋ ๋ชจ๋์ผ๋ ์ ๊ทผํ ์ ์๋ ๊ณต๊ฐ๊ณผ ์ ์ ๋ชจ๋์ผ ๋ ์ ๊ทผํ ์ ์๋ ๊ณต๊ฐ์ด ๋ฌ๋ผ์ง๊ฒ ๋๋ค.
์ ธ
- ๋ช ๋ น์ด์ ์ปค๋์ด ๋ํ๋ฅผ ํ ์ ์๊ฒ ๋์์ฃผ๋ ์ผ์ข ์ ์ธํฐํ์ด์ค
- ๋ช ๋ น์ด ํด์๊ธฐ๋ผ๊ณ ๋ด๋๋จ
์ ์ ๊ฐ ์ ธ(๋ช ๋ น์ด ํด์๊ธฐ)์ ๋ช ๋ น์ ์ ๋ฌํ๋ฉด ์ ธ์ด ์ปค๋ํํ ๋ถํํ๊ณ , ์ปค๋์ด ๋ด๋ถ์ ์ธ ์์ ์ ์คํํ ํ ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ ธ์ ํตํด ์ ์ ์๊ฒ๋ก ์ ๋ฌ
์์คํ ์ฝ (Syscall)์ด๋?
์ ์ ๊ฐ ์ปดํจํฐ ๋ด๋ถ์ ์ ๊ทผํ๊ณ ์ถ์ ๋ ์ปค๋์ ๋ถ๋ฅด๋(call) ๋ช ๋ น์ด.
์๋ํ๋ฉด ์์ ๋งํ๋ฏ์ด ์ ์ ๋ ์์๋ก ์ปค๋ ๋ชจ๋์ ์ง์ ํ ์ ์์. ๋ฐ๋ผ์ ์ ์์ค์ ์์ ์ ํ๊ธฐ ์ํด์๋ ์ปค๋์ ๋์์ด ํ์ํจ. ์ด๋ ์ปค๋์๊ฒ ๋์์ ์์ฒญํ๋ ๋ช ๋ น์ด๊ฐ syscall์ด ๋๋ ๊ฒ์.
์๋ฅผ๋ค์ด ์ฐ๋ฆฌ๊ฐ cat tmp.text๋ผ๋ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ณ ์ถ๋ค๊ณ ํ์. ์ฐ๋ฆฌ๋ ๊ทธ๋ฌ๋ ์ง์ ํ์ผ ์์คํ ์ ์ ๊ทผํ ์ ์๋ค. ๋ฐ๋ผ์ ์ปค๋์ ๋์์ ๋ฐ์์ผํ๋ค.
์ด๋ ๊ฒ ์ฐ๋ฆฌ๊ฐ syscall์ ํตํด ์ปค๋์๊ฒ ๋ถํํ๋ฉด, ์ปค๋์ ํ์ผ ์์คํ ์ ์ง์ ์ ๊ทผํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ฐ๋ฆฌ์๊ฒ ์ ๋ฌํด์ค๋ค.
์ด์ฒ๋ผ ์ปค๋์๊ฒ ๋์์ ์์ฒญํ ๋ syscall์ ์ฌ์ฉํ๋ค.
๋ํ ์ฌ์ฉ์๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ปดํจํฐ์ ์์์ ์ง์ ์ ๊ทผํ ๊ฒฝ์ฐ ๋ชจ๋ ๊ณผ์ ์ ์ง์ ํธ๋ค๋ง์ ํด์ผ ํจ.
ํ์ง๋ง ์ด๋ ๋ถ์ฃผ์๋ก ์ธํด ์ปดํจํฐ ์์คํ ์์ฒด๋ฅผ ํ๊ดดํ ์ ์๋ ์ํ์ด ์์.
ํ์ง๋ง ์์คํ ์ฝ๋ง์ ์ฌ์ฉํ๋ค๋ฉด ์์ฒญ๋ง ํ๊ณ ๊ฒฐ๊ณผ๋ง ๊ธฐ๋ค๋ฆฌ๋ฉด ๋๋ฏ๋ก ์ปดํจํฐ์ ์์คํ ์ด ํ๊ดด๋๋ ์ผ์ ๋ง์ ์ ์์
x64 ์์คํ ์ฝ (Syscall)์ ๋์ ์๋ฆฌ
์์คํ ์ฝ์ ํจ์์ด๋ค. ๋ฐ๋ผ์ ์ธ์๋ฅผ ์ฐ๋ฆฌ๊ฐ ์ ๋ฌํด ์ฃผ์ด์ผํ๋ค. x64์ํคํ ์ณ์์๋ ๋ ์ง์คํฐ๋ก ์ธ์๋ฅผ ์ ๋ฌํ๋ค. ๋ํ rax๋ก ๋ฌด์จ ํ๋์ ์คํํ ๊ฒ์ธ์ง ์๋ ค์ค๋ค.
์์ฒญ: rax
์ธ์ ์์: rdi → rsi → rdx → rcx → r8 → r9 → stack
์ดํด๋ฅผ ์ํด ์๋ ์ฝ๋๋ฅผ ๋ด๋ณด์.
[Register]
rax = 0x1 //write์ด๋ผ๋ ํจ์ ์คํํด์ค
rdi = 0x1 //write์ ์ฒซ ๋ฒ์งธ ์ธ์
rsi = 0x401000 //write์ ๋ ๋ฒ์งธ ์ธ์
rdx = 0xb //write์ ์ธ ๋ฒ์งธ ์ธ์
[Memory]
0x401000 | "Hello Wo"
0x401008 | "rld"
[Code]
syscall //์ด๊ฑธ ํธ์ถํ์ผ๋ฏ๋ก rax, rdi, rsi, rdx์ ์๋ ์ ๋ณด๋ก ํจ์ write(0x1, 0x401000, 0xb)์คํ
------------
[๊ฒฐ๊ณผ]
Hello World
x64 syscall ํ ์ด๋ธ
syscall | rax | arg0 (rdi) | arg1 (rsi) | arg2 (rdx) |
read | 0x00 | unsigned int fd | char *buf | size_t count |
write | 0x01 | unsigned int fd | const char *buf | size_t count |
open | 0x02 | const char *filename | int flags | umode_t mode |
close | 0x03 | unsigned int fd | ||
mprotect | 0x0a | unsigned long start | size_t len | unsigned long prot |
connect | 0x2a | int sockfd | struct sockaddr * addr | int addrlen |
execve | 0x3b | const char *filename | const char *const *argv | const char *const *envp |
๊ฐ๋จํ๊ฒ ํ์ผ์ open ํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค. ์ฐ๋ฆฌ๋ ๋ค์์ ํ์ผ์ ORW(Open, Read, Write)ํ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณผ ๊ฒ์ด๋ค.
push 0x67
mov rax, 0x616c662f706d742f ; ํ์ผ ์ด๋ฆ
push rax
mov rdi, rsp ; rdi = "/tmp/flag" ๊ฐ๋ฆฌํด
xor rsi, rsi ; rsi = 0 ; RD_ONLY
xor rdx, rdx ; rdx = 0
mov rax, 2 ; rax = 2 ; syscall_open
syscall ; open("/tmp/flag", RD_ONLY, NULL)
x86 ์์คํ ์ฝ์ ๋์ ์๋ฆฌ
x86์ cdecl์์๋ ๋ณดํต syscall ๋ง๊ณ int 0x80์ผ๋ก ๋์ ํ๋ค. ๋์ ๊ฑฐ์ ๋น์ทํ ์ญํ ์ ํ๋ค!
int๋ interrupt์ ์ฝ์, 0x80์ "system call interrupt"์ ์๋ฏธํ๋ค. int 0x80์ ์คํํ๋ฉด OS์์ ์์์ ๋ ์ง์คํฐ๋ก ์ ๋ฌํด์ค ์ธ์๋ค์ ๋ง๋ ์์คํ ์ฝ์ ํ๋ค.
x86๋ x64์ ๋์ผํ๊ฒ ์์คํ ์ฝ์ ํ ๋๋ ๋ ์ง์คํฐ๋ก ์ธ์๋ฅผ ์ ๋ฌํ๋๋ฐ, ์ฌ์ฉํ๋ ๋ ์ง์คํฐ๊ฐ ๋ค๋ฅด๋ค!
(์ฐธ๊ณ ๋ก ํจ์ ํธ์ถ ๊ท์ฝ์์ callํ ๋๋ ์ธ์๋ฅผ ๋ ์ง์คํฐ๊ฐ ์๋ ์คํ์ pushํ๋ค!! ์ฃผ์!)
์์ฒญ : eax
์ธ์ ์์ : ebx -> ecx -> edx -> esi -> edi -> ebp
ํ ์ด๋ธ ์ ๋ณด : Linux system call table ์ ๋ฆฌ(32bit, 64bit) (tistory.com)
ํ๋ก์์
ํ๋ก์์ ๋ ํจ์์ฒ๋ผ ์ด๋ค ์ผ์ ํ ๋์์ ํ๋ ์ฝ๋ ์กฐ๊ฐ์ ์๋ฏธํ๋ค. ์ด๋ ํ๋ก์์ ๋ฅผ ํธ์ถํ ๋ ์ฐ๋ฆฌ๋ call ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ค. (syscall์ ์ปค๋ ๋ถ๋ฅด๋ ๋ช ๋ น์ด) ํจ์ ํธ์ถ ๊ท์ฝ์ ์ฐ์ด๋ call์ด ์ด call ์ด๋ค.
ํ๋ก์์ ๋ ์ด๋ฆ์ ๋ถ์ผ ์ ์๋ค.
์์คํ ์ฝ ์ต์คํ๋ก์ ๊ด์
๊ทธ๋ ๋ค๋ฉด ์์คํ ์ฝ์์๋ ์ด๋ค ์ทจ์ฝ์ ์ด ์๋์ง๋ฅผ ์ฐพ์๋ณด์. ์์คํ ์ฝ์ ํ๋ฆ์ ๊ฐ๋จํ๊ฒ ์์ฝํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
- ํ๋ก์ธ์์ ์์คํ ์ฝ ๋ช ๋ น์ด ์ ๋ฌ
- ํ๋ก์ธ์๊ฐ ์ปค๋ ๋ชจ๋์ ์ง์ ํจ + ์ปค๋๊ฐ๋ฐ์๊ฐ ์ง์ ํ ์ง์ ์ฝ๋(Entry Point)๋ฅผ ์คํ
- entry point์์๋ ์๋ ์ฝ๋ํ๋ฆ์ผ๋ก ๋์๊ฐ ์ ์๊ฒ ํ๋ก์ธ์ ์ํ๋ฅผ ์ ์ฅํ๋ ์ญํ ์ ํจ (ํจ์ ํ๋กค๋ก๊ทธ์ฒ๋ผ)
- ์ดํ ์คํ์ด ๋๋๋ฉด ์ ์ฅํด๋จ๋ ์ํ๋ฅผ ๊บผ๋ด์ ์๋์ ํ๋ฆ์ผ๋ก ๋์๊ฐ
์ฌ๊ธฐ์ entry point๋ ์ฌ์ฉ์ ๋ชจ๋์ ์ปค๋ ๋ชจ๋๊ฐ ๊ต์ฐจ๋๋ ์ง์ ์ด๊ธฐ ๋๋ฌธ์ ์ค์ํ ๊ณต๊ฒฉ ๋์์!
โentry point์์๋ ์๋ ์ฝ๋ํ๋ฆ์ผ๋ก ๋์๊ฐ ์ ์๊ฒ "ํ๋ก์ธ์ ์ํ๋ฅผ ์ ์ฅ"ํ๋ ์ญํ ์ ํจ (ํจ์ ํ๋กค๋ก๊ทธ์ฒ๋ผ)
๋ฆฌ๋ ์ค ์ปค๋ ๋ณดํธ ๊ธฐ๋ฒ
- SMEP(Supervisor Mode Execution Protection) : ์ปค๋ ๋ชจ๋์์ ์ฌ์ฉ์ ๋ชจ๋์ ์ฝ๋์ ์คํ์ ๋ง๋ ๊ธฐ๋ฒ (NX๋ ์ ์ฌ)
- SMAP(Supervisor Mode Access Protection) : ๋ช๋ช ์์ธ๋ฅผ ์ ์ธํ๊ณ ๋ ์ปค๋๋ชจ๋์์ ์ฌ์ฉ์ ๊ณต๊ฐ์ ์ ๊ทผ ์์ฒด๋ฅผ ๋ง๋ ๊ธฐ๋ฒ
references
๋๋ฆผํต x86 Assembly๐ค: Essential Part(2)
๋๋ฆผํต https://dreamhack.io/lecture/courses/36
'๐ฅ๏ธ Computer Science > System' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[System] ์ปดํ์ผ ๊ณผ์ ์ ๋งํฌ(Link)์ ์ค๋ธ์ ํธ ํ์ผ(Object File) (0) | 2023.04.01 |
---|---|
[System] ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ (x64, x32, 64bit, 32bit) (0) | 2023.03.29 |
[Assembly] ์ด์ ๋ธ๋ฆฌ์ด ํ์ ๋ช ๋ น์ด ์ ๋ฆฌ๋ณธ (์คํ ๊ด๋ จ) (0) | 2023.03.26 |
[Assembly] x86 ์ด์ ๋ธ๋ฆฌ ํท๊ฐ๋ฆฌ๋ mov, PTR ์ ๋ฆฌ (0) | 2023.03.19 |
[System] ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ / ๋ ์ด์์ (0) | 2023.03.19 |