์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
- ํํ์ง์ ์ํ์ ๊ด๋ จ๋ ์ ๋ณด: ์ํ ๋ฌธ์๋ก.
- ๊ธ์ต ์ํ๊ณผ ๊ด๋ จ๋ ์ ๋ณด: ์ฃผ๊ฐ์ฐ๊ณ์ฆ๊ถ(ELS) ๋ฌธ์๋ก.
- ๊ทธ๋ฃน ์ํผ์ฃผ๋์ด์ ํฌ๋ค: E.L.F. ๋ฌธ์๋ก.
1. ๊ฐ์[ํธ์ง]
Executable and Linkable Format, ๋๋ ELF. ELF๋ ์ ๋์ค ๊ณ์ด ์ด์์ฒด์ ์ ์คํ, ์ค๋ธ์ ํธ ํ์ผ, ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋๋ ์ฝ์ด ๋คํ๋ฅผ ํ ์ ์๊ฒ ํ๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ด๋ค. ๊ฐ๋จํ, ์คํ ํ์ผ์ด๋ค. ์๋ ๋ป์ Extensible Linking Format ์ด๋ผ๋ ๋ป์ ๊ฐ์ง๊ณ ์์๋ค.
์ฌ์ฉํ๋ ์ด์์ฒด์ ๋ ์ ๋์ค, BSD, ์๋ผ๋ฆฌ์ค, ๊ทธ๋ฆฌ๊ณ ๋ฆฌ๋ ์ค๊ฐ ์๋ค. ์๋ฌด๋ฆฌ ๊ฐ์ ๋ฐ์ด๋๋ฆฌ ํฌ๋ฉง์ด๋ผํ์ฌ๋, ์๋ก ํธํ์ด ๋์ง ์๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฆฌ๋ ์ค ํ๋ก๊ทธ๋จ์ ์๋ผ๋ฆฌ์ค์์ ๋๋ฆฌ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋์จ๋ค.
์ฌ์ฉํ๋ ์ด์์ฒด์ ๋ ์ ๋์ค, BSD, ์๋ผ๋ฆฌ์ค, ๊ทธ๋ฆฌ๊ณ ๋ฆฌ๋ ์ค๊ฐ ์๋ค. ์๋ฌด๋ฆฌ ๊ฐ์ ๋ฐ์ด๋๋ฆฌ ํฌ๋ฉง์ด๋ผํ์ฌ๋, ์๋ก ํธํ์ด ๋์ง ์๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฆฌ๋ ์ค ํ๋ก๊ทธ๋จ์ ์๋ผ๋ฆฌ์ค์์ ๋๋ฆฌ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋์จ๋ค.
2. ๊ตฌ์กฐ[ํธ์ง]
ELF ํ์ผ์ ์ด๋ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
ELF Header |
Program header table |
.text |
.rodata |
.data |
Section header table |
2.1. ELF header[ํธ์ง]
๋จผ์ , ELF ํด๋ ๊ฐ์ ๊ฒฝ์ฐ๋ ์คํ ํ์ผ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋งค์ง๋๋ฒ๋ .ELF (0x7F 0x45 0x4C 0x46).
ํ์ผ์ด ์ค๋ธ์ ํธ ํ์ผ์ธ์ง, ์คํ ํ์ผ์ธ์ง, ์๋๋ฉด ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋ ค์ฃผ๋ ๋ฐ์ดํฐ๋, ELF ๋ฒ์ , ์ด๋ค ์ด์์ฒด์ ์ ๋นํธ๋ฅผ ์ํด ์ปดํ์ผ๋๊ฑด์ง์ ๊ดํด ์ ๋ณด๊ฐ ์๋ค.
ํ์ผ์ด ์ค๋ธ์ ํธ ํ์ผ์ธ์ง, ์คํ ํ์ผ์ธ์ง, ์๋๋ฉด ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋ ค์ฃผ๋ ๋ฐ์ดํฐ๋, ELF ๋ฒ์ , ์ด๋ค ์ด์์ฒด์ ์ ๋นํธ๋ฅผ ์ํด ์ปดํ์ผ๋๊ฑด์ง์ ๊ดํด ์ ๋ณด๊ฐ ์๋ค.
์คํ์
| ๊ธธ์ด | ๋ป |
0x00 | 4 | ํค๋์ด๋ค. 0x7F ๋ค์์ ELF๋ผ๊ณ ์ ํ์๋ค. ํ๋ฆฌ๋ฉด ์คํ ์๋๋ค. |
0x04 | 1 | ๋นํธ ์ ๋ณด์ด๋ค. 64 ๋นํธ(0x02)๋ฅผ ์ํ๊ฑด์ง, ์๋๋ฉด 32๋นํธ (0x01)๋ฅผ ์ํ๊ฑด์ง์ ๊ดํ ๋ฐ์ดํธ๋ค. |
0x05 | 1 | Endianness ๊ดํ๊ฒ์ด๋ค. Little Endian (0x01)์ด๊ฑฐ๋, Big Endian (0x02) ์ด์ฌ์ผ ํ๋ค. |
0x06 | 1 | ๋ฒ์ ์ด๋ค. ํญ์ 0x01์ด๋ค. |
0x07 | 1 | ์ด๋ค ์ด์์ฒด์ ๋ฅผ ์ํ์ฌ ์ ์๋์๋์ง๋ฅผ ๊ฒฐ์ ํ๋ค. ๋ฆฌ๋
์ค๋ 0x03, FreeBSD๋ 0x06 ์ด๋ค. ์์ฃผ 0x00์ผ๋ก ์ค์ ๋๋๋ฐ, ๋ฌธ์ ์๋ค. |
0x08 | 1 | ABI ๋ฒ์ . ๋ฆฌ๋
์ค ์์๋ ํน๋ณํ ๋ป์ ์๋๋ฏ ํ๋ค. |
0x09 | 7 | ์ฌ์ฉ ๋๊ณ ์์ง ์๋ค. |
0x10 | 2 | ํ ํ์ผ์ด ์คํ (1), ์ค๋ธ์ ํธ (2), ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (3), ์๋๋ฉด ์ฝ์ด (4) ์ธ์ง ๊ฒฐ์ ํ๋ค. |
0x12 | 2 | ์ํคํ
์ณ. x86์ 0x03, x86-64๋ 0x3E, SPARC์ 0x02์ด๋ค. |
0x14 | 4 | ELF ๋ฒ์ . 0x01์ผ๋ก ์ค์ ๋์ด ์๋ค. |
0x18 | 4, 8 [1] | ์ด๋์ ๋ถํฐ ์คํ๋์ด์ผ ํ๋์ง์ ๊ดํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ํฌ์ธํธ. |
0x1C, 0x20 | 4, 8 | ํ๋ก๊ทธ๋จ ํค๋๊ฐ ์ด๋์ ์์ํด์ผํ๋์ง์ ๊ดํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ํฌ์ธํธ. |
0x20, 0x28 | 4, 8 | ์น์
ํด๋๊ฐ ์ด๋์ ์์ํด์ผํ๋์ง์ ๊ดํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ํฌ์ธํธ. |
0x24, 0x30 | 4 | ์ด ๋ถ๋ถ์ ์ด๋ค ์ํคํ
์ณ์ด๋์ ๋ฐ๋ผ ๋ค๋ฅด๋ค. |
0x28, 0x34 | 2 | ํ ํด๋์ ํฌ๊ธฐ. 32 ๋นํธ์ด๋ฉด 52, 64๋นํธ์ด๋ฉด 64 (16์ง์๊ฐ ์๋๋ค.) |
0x2A, 0x36 | 2 | ํ๋ก๊ทธ๋จ ํด๋ ํฌ๊ธฐ. |
0x2C, 0x38 | 2 | ํ๋ก๊ทธ๋จ ํด๋ ํ
์ด๋ธ ์ํธ๋ฆฌ ์. |
0x2E, 0x3A | 2 | ์น์
ํด๋ ํ
์ด๋ธ ํฌ๊ธฐ. |
0x30, 0x3C | 2 | ์น์
ํด๋ ํ
์ด๋ธ ์ํธ๋ฆฌ ์. |
0x32, 0x3E | 2 | ์น์
์ด๋ฆ๋ค์ด ์๋ ์น์
ํด๋ ํ
์ด๋ธ ์ํธ๋ฆฌ ์ธ๋ฑ์ค. |
2.2. Program Header Table[ํธ์ง]
ํ๋ก๊ทธ๋จ ํด๋ ํ
์ด๋ธ์ด๋ค.
2.3. .text[ํธ์ง]
์ด๊ณณ์ ์ฝ๋๊ฐ ๋ค์ด๊ฐ๋ค. ์ฃผ๋ก, push rax, mov
๋ฌผ๋ก , ๋ฐ์ด๋๋ฆฌ์ด๋ค (...)
[esp - 4], rdi, int 0x80๊ฐ์ ๋ช
๋ น์ด ์๋ค.๋ฌผ๋ก , ๋ฐ์ด๋๋ฆฌ์ด๋ค (...)
2.4. .rodata[ํธ์ง]
Read-only Data segment. ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ ๋ฐ์ดํฐ ๋ถ๋ถ์ด๋ค.
์ฃผ๋ก, static์ด๋, const ๊ฐ๋ค์ด ์ด๊ณณ์ผ๋ก ์จ๋ค.
char s[] = "hello world"; ์ฃผ๋ก, ์ด๋ฐ ์ฝ๋๊ฐ ์ด ๋ถ๋ถ์ ๋ค์ด๊ฐ๋ค.์ฃผ๋ก, static์ด๋, const ๊ฐ๋ค์ด ์ด๊ณณ์ผ๋ก ์จ๋ค.
2.5. .data[ํธ์ง]
์ด๊ณณ์๋ ๋ฐ์ดํฐ๋ค์ด ์๋ค.
์๋ฅผ ๋ค์ด, Hello, World! ํ๋ก๊ทธ๋จ์ด๋ผ๋ฉด, Hello, World! ํ๋ ๋ฌธ์์ด์ด ์ ์ฅ๋์ด ์๋ค.
๋ณดํต .text์ ๋ช ๋ น์ด๊ฐ ์ด ๋ฌธ์์ด์ ๋ถ๋ฌ ์จ๋ค.
.rodata์์ ์ฐจ์ด์ ์, ์ด ๋ถ๋ถ์ ์ฝ๊ณ ์ธ์์๋ค.
์๋ฅผ ๋ค์ด, Hello, World! ํ๋ก๊ทธ๋จ์ด๋ผ๋ฉด, Hello, World! ํ๋ ๋ฌธ์์ด์ด ์ ์ฅ๋์ด ์๋ค.
๋ณดํต .text์ ๋ช ๋ น์ด๊ฐ ์ด ๋ฌธ์์ด์ ๋ถ๋ฌ ์จ๋ค.
.rodata์์ ์ฐจ์ด์ ์, ์ด ๋ถ๋ถ์ ์ฝ๊ณ ์ธ์์๋ค.
2.6. Section Header Table[ํธ์ง]
[1] 32 ๋นํธ์ผ๊ฒฝ์ฐ 4์ด๊ณ , 64๋นํธ์ด๋ฉด 8์ด๋ค.