
File Descriptor (FD)
์ถ์ฒ https://dev-ahn.tistory.com/96
https://twofootdog.tistory.com/51
ํ์ผ ๋์คํฌ๋ฆฝํฐ
- ์์คํ ์ผ๋ก๋ถํฐ ํ ๋น ๋ฐ์ ํ์ผ์ ๋ํํ๋ 0์ด ์๋ ์ ์ ๊ฐ
- ํ๋ก์ธ์ค์์ ์ด๋ฆฐ ํ์ผ์ ๋ชฉ๋ก์ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ์ ์ธ๋ฑ์ค
์ ๋์ค ์์คํ ์์ ํ๋ก์ธ์ค๊ฐ ํ์ผ๋ค์ ์ ๊ทผํ ๋์ file descriptor๋ผ๋ ๊ฐ๋ ์ ์ด์ฉ
- file descriptor๋ ์์๊ฐ ์๋ 0๊ณผ ์์์ธ ์ ์ ๊ฐ์ ๊ฐ๋๋ค.
- ํ๋ก์ธ์ค ์คํ ์ค์ ํ์ผ์ openํ๋ฉด ์ปค๋์ ํด๋น ํ๋ก์ธ์ค์ ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ซ์ ์ค์ ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฅ ์์ ๊ฐ์ ํ ๋นํด์ค๋ค.
- ๊ทธ ๋ค์ ํ๋ก์ธ์ค๊ฐ ์ด๋ ค์๋ ํ์ผ์ ์์คํ ์ฝ์ ์ด์ฉํด์ ์ ๊ทผ ํ ๋, FD ๊ฐ์ ์ด์ฉํด ํ์ผ์ ์ง์นญ
ํ๋ก๊ทธ๋จ์ด ํ๋ก์ธ์ค๋ก ๋ฉ๋ชจ๋ฆฌ์์ ์คํ ์์ํ ๋, ๊ธฐ๋ณธ์ ์ผ๋ก ํ ๋น๋๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ
- ํ์ค ์ ๋ ฅ(Standard Input) - 0 ํ ๋น → POSIX ํ์ค) STDIN_FILENO
- ํ์ค ์ถ๋ ฅ(Standard Output) - 1 ํ ๋น → POSIX ํ์ค) STDOUT_FILENO
- ํ์ค ์๋ฌ(Standard Error) - 2 ํ ๋น → POSIX ํ์ค) STDERR_FILENO
* POSIX ํ์ค ๋ฉํฌ๋ก๋ <unistd.h> ํค๋ ํ์ผ์์ ์ฐพ์๋ณผ ์ ์๋ค.
โ 0์ด ์๋ ์ ์๋ก ํํ๋๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ 0 ~ OPEN_MAX ๊น์ง์ ๊ฐ์ ๊ฐ์ง ์ ์๊ณ , OPEN_MAX์ ๊ฐ์ ํ๋ซํผ์ ๋ฐ๋ผ ๋ค๋ฆ
* ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ ํ๋ก์ธ์ค๊ฐ ์ ์งํ๊ณ ์๋ FD ํ ์ด๋ธ์ ์ธ๋ฑ์ค
FD 3๋ฒ์ด๋ผ๋ ์๋ฏธ๋ FD ํ ์ด๋ธ์ 3๋ฒ ํญ๋ชฉ์ด ๊ฐ๋ฆฌํค๋ ํ์ผ์ด๋ผ๋ ์๋ฏธ
FD ํ ์ด๋ธ์ ๊ฐ ํญ๋ชฉ์ FD ํ๋๊ทธ์ ํ์ผ ํ ์ด๋ธ๋ก์ ํฌ์ธํฐ๋ฅผ ๊ฐ๊ณ ์๋ค → ์ด ํฌ์ธํฐ๋ฅผ ์ด์ฉํด์ FD๋ฅผ ํตํด ์์คํ ์ ํ์ผ์ ์ฐธ์กฐ
FD ํ ์ด๋ธ๊ณผ ํ์ผ ํ ์ด๋ธ์ ์ ๋ณด๋ ๋ฐ๋์ ์ปค๋์ ํตํด์ ์์ ํด์ผ ํจ
fd = open( pathname, flags, mode )
// pathname ์ด ๊ฐ๋ฆฌํค๋ ํ์ผ์ ์ด๊ณ ์ด๋ฆฐ ํ์ผ์ ์ดํ ํธ์ถ์์ ์ฐธ์กฐ ํ ๋ ์ธ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฆฌํด.
// flags๋ ํ์ผ์ ์ฝ๊ธฐ, ์ฐ๊ธฐ, ๋๋ค๋ฅผ ์ํด ์ด์ง๋ฅผ ์ง์ ํ๋ค.
numread = read( fd, buffer, count )
// fd๊ฐ ๊ฐ๋ฆฌํค๋ ํ์ผ์์ ์ต๋ count ๋ฐ์ดํธ๋ฅผ ์ฝ์ด buffer์ ์ ์ฅ.
numwritten = write( fd, buffer, count )
// ๋ฒํผ์์ ์ต๋ count ๋ฐ์ดํธ๋ฅผ fd๊ฐ ๊ฐ๋ฆฌํค๋ ์ด๋ ค ์๋ ํ์ผ์ ์ด๋ค.
status = close(fd)
// ๋ชจ๋ i/o ๋ฅผ ๋ง์น๋ค fd์ ๊ด๋ จ ์ปค๋ ์์์ ํด์ ํ๋ค.
fd๋ ํด๋น ํ๋ก์ธ์ค์ open file์ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด์ index์ด๋ค.
- ๊ทธ ๊ตฌ์กฐ์ฒด์ index๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด๊ฐ dentry๋ผ๋ ๊ฐ์ฒด
- dentry ๊ฐ์ฒด๋ ํด๋น ํ์ผ์ ๋ํ๋ด๋ inode ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- open()์ ํตํด ์ป๋ fd๋ ๊ตฌ์กฐ์ฒด์ index์
- ์ผ๋ฐ์ ์ผ๋ก 0, 1, 2 ์ธ๋ฑ์ค๋ std-in / std-out / error์ ๊ด๋ จ๋ fd๋ก ๋ฏธ๋ฆฌ ํ ๋น์ด ๋๊ณ , ๋ณดํต open()์ ํ๋ฉด fd๋ ๊ฐ์ 3์ด๋ค.
- dentry๋ directory entry๋ฅผ ์๋ฏธ. → ๋ฆฌ๋
์ค์์ ๋๋ ํ ๋ฆฌ์ ์ ๊ทผ์ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํ ๊ตฌ์กฐ์ฒด๋ก ์ฌ์ฉ๋จ
- dentry ๊ตฌ์กฐ์ฒด๋ ๊ด๋ จ๋ inode ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ํ๋๋ฅผ ํฌํจํ๋ค
- ๋ฐ๋ผ์ ์ฌ์ฉ์๊ฐ 3๋ฒ์ ๊ฐ์ง๊ณ ์์คํ ์ฝ์ ์ํํ๊ฒ ๋๋ฉด, ํด๋น ํ๋ก์ธ์ค์ files_struct์ fd_array index๋ฅผ ํตํด์ inode์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ ๊ฒ์
File Descriptor์ ์ด๋ ค์๋ ํ์ผ์ ๊ด๊ณ
- ๊ฐ ํ๋ก์ธ์ค๋ณ๋ก ์ปค๋์ open file descriptor table์ ๊ฐ๊ณ ์๋ค.
- ํ ์ด๋ธ์ ๊ฐ entry๋ ํ๋์ ํ์ผ ๋์คํฌ๋ฆฝํฐ(fd)์ ๋ํ ๋์ ์ ์ด ํ๋๊ทธ, ์ด๋ฆฐ ํ์ผ์ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๋ฅผ ๋ด๊ณ ์๋ค.
- open file description์ ํ์ฌ ํ์ผ์ offset, flag, ์ ๊ทผ ๋ชจ๋, i/o ๊ด๋ จ ์ค์ , ํ์ผ์ i-node ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ ํผ๋ฐ์ค๋ฅผ ๊ฐ๊ณ ์๋ค.
- i-node๋ ํ์ผ ์ข ๋ฅ (์ผ๋ฐํ์ผ, ์์ผ, fifo)์ ๊ถํ, lock ๋ชฉ๋ก ํฌ์ธํฐ, ์ฌ๋ฌ ํ์ผ ์คํผ๋ ์ด์ ๊ณผ ๋ค์ํ ํ์ผ ์์ฑ(ํฌ๊ธฐ, ํ์์คํฌํ ๋ฑ)์ ๊ฐ๊ณ ์๋ค.
- ๊ฐ์ open file description์ ๊ฐ๋ฆฌํค๋ 2๊ฐ์ fd๋ offset ๊ฐ์ ๊ณต์ ํ๋ค.
ํ์ผ ๋์คํฌ๋ฆฝํฐ (File Descriptor) ํ์ธํ๋ ๋ฐฉ๋ฒ
์คํ ์ค์ธ ํ๋ก์ธ์ค PID ํ์ธ
$ ps -ef | grep sshd
PID๋ก ํด๋น ํ๋ก์ธ์ค์ ํ์ผ ๋์คํฌ๋ฆฝํฐ(File Descriptor) ์ ๋ณด ํ์ธ
# sudo ls -trn /proc/[PID]/fd
'Pwnable' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[pwnable] bof (0) | 2022.05.18 |
---|---|
[pwnable] shellshock (0) | 2022.05.18 |
[pwnable] leg (0) | 2022.05.06 |
[pwnable] fd (0) | 2022.05.04 |