article thumbnail image
Published 2022. 5. 4. 11:46

File Descriptor (FD)

์ถœ์ฒ˜ https://dev-ahn.tistory.com/96  

https://twofootdog.tistory.com/51

 

ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ

- ์‹œ์Šคํ…œ์œผ๋กœ๋ถ€ํ„ฐ ํ• ๋‹น ๋ฐ›์€ ํŒŒ์ผ์„ ๋Œ€ํ‘œํ•˜๋Š” 0์ด ์•„๋‹Œ ์ •์ˆ˜ ๊ฐ’

- ํ”„๋กœ์„ธ์Šค์—์„œ ์—ด๋ฆฐ ํŒŒ์ผ์˜ ๋ชฉ๋ก์„ ๊ด€๋ฆฌํ•˜๋Š” ํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค

 

์œ ๋‹‰์Šค ์‹œ์Šคํ…œ์—์„œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŒŒ์ผ๋“ค์„ ์ ‘๊ทผํ•  ๋•Œ์— file descriptor๋ผ๋Š” ๊ฐœ๋…์„ ์ด์šฉ

  • file descriptor๋Š” ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ 0๊ณผ ์–‘์ˆ˜์ธ ์ •์ˆ˜ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.
  • ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ ์ค‘์— ํŒŒ์ผ์„ openํ•˜๋ฉด ์ปค๋„์€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ˆซ์ž ์ค‘์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ํ• ๋‹นํ•ด์ค€๋‹ค.
  • ๊ทธ ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ด๋ ค์žˆ๋Š” ํŒŒ์ผ์— ์‹œ์Šคํ…œ ์ฝœ์„ ์ด์šฉํ•ด์„œ ์ ‘๊ทผ ํ•  ๋•Œ, FD ๊ฐ’์„ ์ด์šฉํ•ด ํŒŒ์ผ์„ ์ง€์นญ

 

ํ”„๋กœ๊ทธ๋žจ์ด ํ”„๋กœ์„ธ์Šค๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‹คํ–‰ ์‹œ์ž‘ํ•  ๋•Œ, ๊ธฐ๋ณธ์ ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ

  1. ํ‘œ์ค€ ์ž…๋ ฅ(Standard Input)    -   0 ํ• ๋‹น   → POSIX ํ‘œ์ค€) STDIN_FILENO
  2. ํ‘œ์ค€ ์ถœ๋ ฅ(Standard Output)  -   1 ํ• ๋‹น   → POSIX ํ‘œ์ค€) STDOUT_FILENO
  3. ํ‘œ์ค€ ์—๋Ÿฌ(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
๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค!