Unit Test

Unit Test ํ…Œ์ŠคํŠธ์˜ ์†์„ฑ ์ข‹์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜ ์„ธ ๊ฐ€์ง€ ๊ธฐ์ค€์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ€๋…์„ฑ 3A(Arrange / Act / Assert) ์ˆœ์„œ๋Œ€๋กœ test case ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. test case ๊ฐ€ ์–ด๋–ค ๋™์ž‘์„ ๊ฒ€์ฆํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. test case ์˜ ์ด๋ฆ„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑ ํ•„์š” ์ตœ์‹  test framework (java ์—์„œ ์‚ฌ์šฉํ•˜๋Š” spock)์—์„œ๋Š” ์ž์—ฐ์–ด๋กœ test case ์ด๋ฆ„์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. (google test ๋Š” ๋ฏธ์ง€์›) test case ์‹คํ–‰ ์‹œ printf ๋ฌธ์„ ํ•œ ๋ฒˆ ์ถœ๋ ฅ ํ•˜๋„๋ก ๊ทœ์น™์„ ์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. #define SPEC(msg) printf("[SPEC] %s\n", msg) TEST(SampleTestCase, SampleTest) { SPEC("์ด ํ…Œ์ŠคํŠธ๋Š” ๋ฌด์—‡์„ ํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ž…๋‹ˆ๋‹ค"); } ์ฝ”๋“œ๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ์˜ค๋ฅ˜์˜ ์›์ธ์„ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ž์—ฐ์—ฌ์™€ ๊ฐ€๊น๊ฒŒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•˜๋‹ค. ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ž์—ฐ์–ด๋กœ ์ƒ์„ธํžˆ ์ง€์ • ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ž์—ฐ์–ด๋กœ ์ถœ๋ ฅ ์œ ์ง€๋ณด์ˆ˜์„ฑ ...

<span title='2024-08-19 04:00:00 +0900 KST'>August 19, 2024</span>&nbsp;ยท&nbsp;37 min&nbsp;ยท&nbsp;AswinBlue

Window_programming

Window Programming PE ์œˆ๋„์šฐ๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์„ PE ํฌ๋ฉง์ด๋ผ ์นญํ•œ๋‹ค. (๋ฆฌ๋ˆ…์Šค์˜ ELF ์™€ ์œ ์‚ฌ) PE ํŒŒ์ผ์€ header ์™€ section ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. section ์—๋Š” ์ด๋ฆ„, ํฌ๊ธฐ, ๋กœ๋“œ๋  ์ฃผ์†Œ์˜ ์˜คํ”„์…‹, ์†์„ฑ๊ณผ ๊ถŒํ•œ ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. PE ํŒŒ์ผ์— ๋“ค์–ด๊ฐ€์•ผ ํ•  ํ•„์ˆ˜ section ์€ ์—†์ง€๋งŒ, โ€˜.textโ€™, โ€˜.dataโ€™, โ€˜.rdataโ€™ section ์ด ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. .text: ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ธฐ๊ณ„์ฝ”๋“œ๊ฐ€ ์œ„์น˜ํ•˜๋Š” ์˜์—ญ (์ฝ๊ธฐ, ์“ฐ๊ธฐ ๊ฐ€๋Šฅ) .data: ์ปดํŒŒ์ผ ์‹œ์ ์— ์ •ํ•ด์ง„ ์ „์—ญ ๋ณ€์ˆ˜๋“ค์ด ์œ„์น˜ํ•˜๋Š” ์˜์—ญ (์ฝ๊ธฐ, ์“ฐ๊ธฐ ๊ฐ€๋Šฅ) .rdata: ์ปดํŒŒ์ผ ์‹œ์ ์— ๊ฐ’์ด ์ •ํ•ด์ง„ ์ „์—ญ ์ƒ์ˆ˜์™€ ์ฐธ์กฐํ•  DLL ๋ฐ ์™ธ๋ถ€ ํ•จ์ˆ˜๋“ค์˜ ์ •๋ณด๊ฐ€ ์œ„์น˜ํ•˜๋Š” ์˜์—ญ (์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅ) ์œˆ๋„์šฐ๊ฐ€ ์‹คํ–‰๋˜๋ฉด PE ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ๋œ๋‹ค.

<span title='2024-05-12 16:02:25 +0900 KST'>May 12, 2024</span>&nbsp;ยท&nbsp;1 min&nbsp;ยท&nbsp;AswinBlue

Reverse Engineering

Reverse Engineering software ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์—ญ์œผ๋กœ ์ƒ์„ฑ ํ•ด ๋‚ด๋Š” ๊ธฐ๋ฒ• software ๋ถ„์„ ๋ฐฉ๋ฒ• Static analysis ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค์ง€ ์•Š๊ณ  ์ˆ˜ํ–‰ํ•˜๋Š” ๋ถ„์„์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ์ „์ฒด ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ, ํ™˜๊ฒฝ์  ์ œ์•ฝ ์‚ฌํ•ญ์— ์ž์œ ๋กญ๊ณ , ์•…์„ฑ ์ฝ”๋“œ์˜ ์œ„ํ˜‘์œผ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜๋‹ค. ๋‚œ๋…ํ™” ์ ์šฉ์‹œ ๋ถ„์„์ด ์–ด๋ ค์›Œ ์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ์ •์ ๋ถ„์„์— ์‚ฌ์šฉ๋˜๋Š” ํˆด๋กœ๋Š” IDA ๊ฐ€ ์žˆ๋‹ค. IDA ๋Š” ํ”„๋ฆฌ์›จ์–ด๋กœ https://hex-rays.com/ida-free/ ์—์„œ ๋‹ค์šด ๊ฐ€๋Šฅํ•˜๋‹ค. Dynamic analysis ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๋ฉฐ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ถ„์„์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐœ๋žต์ ์ธ ๋™์ž‘์„ ๋น ๋ฅด๊ฒŒ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ •์  ๋ถ„์„๊ณผ ๋ฐ˜๋Œ€๋กœ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์— ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ์•ˆํ‹ฐ ๋””๋ฒ„๊น… ๊ธฐ๋ฒ• ์ ์šฉ๋œ ํ”„๋กœ๊ทธ๋žจ์€ ๋””๋ฒ„๊น…์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. IDA ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ํˆด ๋‹จ์ถ•์–ด shift + F12 ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰, String ํƒญ์œผ๋กœ ์ด๋™ x ์ƒํ˜ธ์ฐธ์กฐ ํ™•์ธ, ๋ณ€์ˆ˜ ๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ณณ์˜ ์œ„์น˜๋ฅผ ํ™•์ธ F5 ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ C ์–ธ์–ด ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ g ํŠน์ • ์ฃผ์†Œ ํ˜น์€ ๋ผ์ธ์œผ๋กœ ์ด๋™ ๋””์ปดํŒŒ์ผ ๋œ ํ•จ์ˆ˜ ์ด๋ฆ„ ์œ„์— ์ปค์„œ๋ฅผ ๋†“๊ณ  g ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์–ด์…ˆ๋ธ”๋ฆฌ ์ƒ ํ•จ์ˆ˜ ๋ผ์ธ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ ์–ด๋„ ํ•จ์ˆ˜ ์œ„์น˜๋กœ ์ด๋™๋œ๋‹ค. ESC ์ด์ „ ์ปค์„œ ์œ„์น˜๋กœ ์ด๋™ Ctrl + Enter ๋‹ค์Œ ์ปค์„œ ์œ„์น˜๋กœ ์ด๋™ n ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ Y ๋ณ€์ˆ˜ ํƒ€์ž… ์„ค์ • ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ, ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž… ๋ณ€๊ฒฝ F2 ์–ด์…ˆ๋ธ”๋ฆฌ ํ˜น์€ C ์–ธ์–ด ๋ผ์ธ์—์„œ๋Š” break point(์ค‘๋‹จ์ ) ์„ค์ • stack ๋˜๋Š” hex View ์—์„œ๋Š” ๊ฐ’ ๋ณ€๊ฒฝ F9 ์‹คํ–‰ (run) ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œ์ผœ ๋™์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. F8 ํ•œ ๋‹จ๊ณ„ ์‹คํ–‰ (next) F7 ํ•จ์ˆ˜ ๋‚ด๋ถ€๋กœ ์ง„์ž… (step int) Ctrl + F2 ๋””๋ฒ„๊น… ์ค‘๋‹จ r hex ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ Shift + E ์„ ํƒํ•œ ๊ฐ’์„ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ถ”์ถœ(export) hex ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ถ”์ถœํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. ํ™”๋ฉด IDA View ...

<span title='2024-05-12 14:42:07 +0900 KST'>May 12, 2024</span>&nbsp;ยท&nbsp;5 min&nbsp;ยท&nbsp;AswinBlue

Exploit

Exploit pwntool์˜ checksec ๋ช…๋ น์–ด๋กœ ์–ด๋–ค ๋ณด์•ˆ์ด ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค. Shell Code exploit์€ ํŒŒ์ผ ์ฝ๊ณ  ์“ฐ๊ธฐ(open-read-write, orw), ์…ธ ๋ช…๋ น ์‹คํ–‰(execve) ๊ถŒํ•œ์„ ์ทจ๋“ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. Shell ๊ถŒํ•œ์„ ํš๋“ํ•˜๊ธฐ ์œ„ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋“ค์˜ ๋ชจ์Œ์„ โ€˜Shell Codeโ€™ ๋ผ ์นญํ•œ๋‹ค. ํ™˜๊ฒฝ์„ธํŒ… pwntools checksec shellcraft ROPgadget one_gadget patchelf ์ทจ์•ฝ์  ๊ณต๊ฒฉ ์ˆœ์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋ณดํ˜ธ๊ธฐ๋ฒ•์„ ํ™•์ธํ•œ๋‹ค. checksec ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์ ์šฉ๋œ ๋ณดํ˜ธ๊ธฐ๋ฒ•์„ ํ™•์ธํ•˜๊ณ , ์ ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ exploit ๊ธฐ๋ฒ•์„ ์ถ”๋ ค๋‚ธ๋‹ค. checksec ์ฐธ์กฐ ldd ๋ช…๋ น์„ ํ™œ์šฉํ•˜์—ฌ ์˜์กด์„ฑ ๊ด€๊ณ„๋ฅผ ํ™•์ธํ•œ๋‹ค. ldd ๋ช…๋ น ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์—ฌ ์ทจ์•ฝ์  ๋ฐ ๊ตฌ์กฐ(stack ํ˜•ํƒœ)์„ ํŒŒ์•…ํ•œ๋‹ค stack์€ ํ•จ์ˆ˜์—์„œ ์„ ์–ธ๋œ ์ˆœ์„œ๋Œ€๋กœ ํ• ๋‹น๋˜์ง€ ์•Š์Œ์— ์ฃผ์˜ํ•˜๋ฉฐ, ๋ฌด์กฐ๊ฑด assembly์–ด๋ฅผ ํ†ตํ•ด stack ์ฃผ์†Œ์—์„œ ํŠน์ • ๋ณ€์ˆ˜์˜ ์œ„์น˜๋ฅผ ํ™•์ธํ•˜๋„๋ก ํ•œ๋‹ค. ...

<span title='2024-03-11 20:46:33 +0900 KST'>March 11, 2024</span>&nbsp;ยท&nbsp;67 min&nbsp;ยท&nbsp;AswinBlue

System_programming

System Programming ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ž‘ํ•˜๋Š” ๊ตฌ์กฐ๋Š” ํฌ๊ฒŒ application, kernel, HW ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. _____________ | Library | ยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏ Application level ------------------------------ _____________ |System call| ยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏ Kernel level ------------------------------ _____________ | Hardware | ยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏยฏ H/W level ------------------------------ application level์—์„œ๋Š” library๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด ์ฝ”๋“œ๋“ค์€ library buffer๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (open(), read(), write(), close() โ€ฆ) ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ตœ์ ์˜ buffer ๋‹จ์œ„๋กœ disk์—์„œ ๊ฐ’์„ ์ฝ์–ด์˜ค๊ณ , library buffer์— ๋‹ด์•„๋‘๋ฉด ์ž‘์€๋‹จ์œ„๋กœ ์ฝ์–ด์˜ฌ ๋•Œ ํšจ์œจ์ ์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ํ•œ ์ค„์”ฉ ํŒŒ์ผ์„ ์ฝ์–ด์•ผ ํ•œ๋‹ค๋ฉด, 1byte์”ฉ ํŒŒ์ผ์—์„œ โ€˜\nโ€™์„ ๊ฐ์ง€ํ•  ๋•Œ ๊นŒ์ง€ ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, BUF_SIZ๋งŒํผ ํŒŒ์ผ์—์„œ ์ฝ์–ด์„œ library buffer์— ๋‹ด์•„๋‘๊ณ  library buffer๋ฅผ 1byte์”ฉ ์ฝ์œผ๋ฉฐ โ€˜\nโ€™๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ์‹คํ–‰ ์†๋„๋Š” ๋” ๋น ๋ฅด๋‹ค. (IO์ ‘๊ทผ์€ ์ ์„์ˆ˜๋ก ํšจ์œจ์ ) Kernel level์—์„œ๋Š” System call์„ ์‚ฌ์šฉํ•˜๋ฉฐ system buffer๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. application level ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋ณดํ†ต library buffer๋ฅผ 1์ฐจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ๋‚ด๋ถ€์ ์œผ๋กœ system call์„ ์ˆ˜ํ–‰ํ•ด system buffer๋ฅผ 2์ฐจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. printf๋Š” c library ํ•จ์ˆ˜์ด๋ฉฐ, โ€˜\nโ€™์„ ๋งŒ๋‚˜์•ผ ํ™”๋ฉด์ƒ์— ์ถœ๋ ฅ์„ ํ•œ๋‹ค. โ€˜\nโ€™์ด ์ž…๋ ฅ๋˜๊ธฐ ์ „ ๊นŒ์ง€ ๋ฌธ์ž์—ด๋“ค์€ library buffer์— ๊ธฐ๋ก๋œ๋‹ค. fprintf๋Š” โ€˜\nโ€™๊ณผ ์ƒ๊ด€์—†์ด ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ฆ‰ library buffer๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ํŒŒ์ผ ์ž…์ถœ๋ ฅ fgetc C์—์„œ ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” fopen ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. fopen์€ ํŒŒ์ผ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์ฝ”๋“œ ๋‚ด์—์„œ ํŒŒ์ผ ํฌ์ธํ„ฐ๋กœ ํ•ด๋‹น ํŒŒ์ผ์— ์ ‘๊ทผ์ด๊ฐ€๋Šฅํ•˜๋‹ค. fgetc(FPTR) ํ•จ์ˆ˜๋Š” fopen์œผ๋กœ ์—ฐ ํŒŒ์ผ ํฌ์ธํ„ฐ๋ฅผ ์ฐธ์กฐํ•ด์„œ char ํ•˜๋‚˜๋ฅผ ์ฝ๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค. fgetc ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ int ํ˜•ํƒœ์ด๋‹ค. text file์„ ์ฝ์„ ๋•, 0xFF๊ฐ’์ด ๋‚ด์šฉ์— ์˜ฌ ์ˆ˜ ์—†์ง€๋งŒ, binary file์„ ์ฝ์„ ๋• ์ค‘๊ฐ„์— 0xFF ๊ฐ’์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. char ํ˜•ํƒœ๋กœ 0xFF๋ฅผ ์ฝ์œผ๋ฉด -1๊ฐ’์— ํ•ด๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์—, EOF์™€ ๊ตฌ๋ถ„์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ char ๋Œ€์‹  int๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋˜์–ด์žˆ๋‹ค. ํŒŒ์ผ ๊ตฌ์กฐ์ฒด fopen์€ ํŒŒ์ผ ๊ตฌ์กฐ์ฒด์˜ ์ฃผ์†Œ(ํฌ์ธํ„ฐ)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํŒŒ์ผ ๊ตฌ์กฐ์ฒด๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ๋‹ค. _flags: _IO_read_ptr : ๋‹ค์Œ ๋ช…๋ น์‹œ ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ์“ธ ์œ„์น˜ _IO_read_end: kernel์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ์ €์žฅํ•  ๋ฒ„ํผ์˜ ๋ ์œ„์น˜. _IO_read_base: kernel์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ์ €์žฅํ•  ๋ฒ„ํผ์˜ ์‹œ์ž‘ ์œ„์น˜. ํŒŒ์ผ์— ๋Œ€ํ•œ ์ฝ๊ธฐ ๋ช…๋ น(fgetc/fgets๋“ฑ) ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, kernel์€ 4096byte(BUF_SIZE) ๋งŒํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ฝ์–ด์„œ ์ด๊ณณ์— ์ฑ„์›Œ๋‘”๋‹ค. _fileno: ํŒŒ์ผ์˜ offset, kernel์—์„œ ํ•ด๋‹น ํŒŒ์ผ์— ์ •ํ•ด์ค€ index(kernel ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.) fopen ์‹œ์— ํŒŒ์ผ ๊ตฌ์กฐ์ฒด๊ฐ€ ์ƒ์„ฑ ๋ฐ ์ดˆ๊ธฐํ™” ๋˜์ง€๋งŒ, IO_read* ์ธ์ž๋“ค์€ ํŒŒ์ผ ์ ‘๊ทผ์ด ์ด๋ฃจ์–ด์ง๊ณผ ๋™์‹œ์— ๊ฐ’์ด ์ ์šฉ๋œ๋‹ค. EOF ํŒŒ์ผ์„ ๋๊นŒ์ง€ ์ฝ์—ˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์€, EOF ๋ฌธ์ž(-1) ์œผ๋กœ ํŒ๋‹จํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œํŒŒ์ผ์„ ์ฝ์–ด๋ณด๋ฉด ๋งˆ์ง€๋ง‰์— -1๊ฐ’์ด ์‹ค์ œ๋กœ ๋“ค์–ด์žˆ์ง€๋Š” ์•Š๋‹ค. EOF ๊ฐ’์€ file I/O ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์ผ ๋ฟ ์‹ค์ œ ํŒŒ์ผ์— ๊ธฐ์ž…๋œ ๊ฐ’์ด ์•„๋‹ˆ๋‹ค. file I/O ํ•จ์ˆ˜๋Š” i-node์— ๊ธฐ๋ก๋œ ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒŒ์ผ ๋์„ ํŒ๋‹จํ•œ๋‹ค. ASKII ์ฝ”๋“œ ์ค‘ ์ฃผ์š” ๋ฌธ์ž์˜ ๊ฐ’ ์ฐธ์กฐ a: 97 A: 68 0: 48 \n: 10 \r: 13 (๊ณต๋ฐฑ): 32 \t: 9 \0: 0 fguts(BUFF, SIZE, FPTR) ํ•จ์ˆ˜๋Š” fopen์œผ๋กœ ์—ฐ ํŒŒ์ผ ํฌ์ธํ„ฐ๋ฅผ ์ฐธ์กฐํ•ด์„œ line ํ•˜๋‚˜๋ฅผ ์ฝ์–ด์˜จ๋‹ค. fputs(BUFF, FPTR) ํ•จ์ˆ˜๋Š” fopen์œผ๋กœ ์—ฐ ํŒŒ์ผ ํฌ์ธํ„ฐ๋ฅผ ์ฐธ์กฐํ•ด์„œ line ํ•˜๋‚˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋ฆฌ๋ˆ…์Šค์—์„œ ํ‘œ์ค€ ์ž…๋ ฅ/์ถœ๋ ฅ/์—๋Ÿฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒŒ์ผ ํฌ์ธํ„ฐ๋ฅผ ์—ด์–ด๋‘”๋‹ค. ๊ฐ๊ฐ ์•„๋ž˜ ๋ฌธ์ž์—ด ํ˜น์€ ๋ฒˆํ˜ธ๋กœ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•˜๋‹ค. stdin : ํ‘œ์ค€ ์ž…๋ ฅ stdout : ํ‘œ์ค€ ์ถœ๋ ฅ stderr: ํ‘œ์ค€ ์—๋Ÿฌ -> ํŒŒ์ผ ํฌ์ธํ„ฐ ๋Œ€์‹  stdout ์„ ์ž…๋ ฅํ•˜๋ฉด ํ‘œ์ค€ ์ถœ๋ ฅ์œผ๋กœ ๋ฌธ์ž์—ด์ด ์ถœ๋ ฅ๋œ๋‹ค. (ex: fputc(BUF, stdout)) ...

<span title='2023-07-15 08:35:21 +0900 KST'>July 15, 2023</span>&nbsp;ยท&nbsp;10 min&nbsp;ยท&nbsp;AswinBlue