C์ฝ๋๋ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ์ปดํ์ผ ํ ๋ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ํ ๋ Object File์ด ๋ ๋๋ ์๊ณ ,,, ๊ธฐ๊ณ์ด ์ฝ๋๊ฐ ๋ ๋๋ ์๊ณ (?)ํด์ ๋๋์ฒด ๋์ ์ฐจ์ด๊ฐ ๋ญ์ง, ๊ทธ๋ฆฌ๊ณ ์ค๋ธ์ ํธ ํ์ผ์ด๋ผ๋๊ฒ ์ ํํ๊ฒ ๋ญ ์ง์นญํ๋์ง ๊ถ๊ธํด์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๊ฐ์ ๋์ค๋ '๋งํฌ'์ ๊ฐ๋ ์ ๋ค๋ค๋ณด๊ณ ์ ํ๋ค.
์ค๋ ๋ค๋ฃฐ ๊ฒ์ ๋ค์๊ณผ ๊ฐ๋ค
- ๊ธฐ๊ณ์ด ์ฝ๋ vs ์ค๋ธ์ ํธ ์ฝ๋ (vs ์ด์ ๋ธ๋ฆฌ ์ฝ๋)
- ๋งํฌ(Link)์ ๊ฐ๋
- gcc vs as
๊ธฐ๊ณ์ด ์ฝ๋ vs ์ค๋ธ์ ํธ ์ฝ๋ (vs ์ด์ ๋ธ๋ฆฌ ์ฝ๋) ๋ ์๋ ๊ธ์ ์ฐธ๊ณ ํ์๋ค.
Machine code is binary (1's and 0's) code that can be executed directly by the CPU. If you open a machine code file in a text editor you would see garbage, including unprintable characters (no, not those unprintable characters ;) ).
Object code is a portion of machine code not yet linked into a complete program. It's the machine code for one particular library or module that will make up the completed product. It may also contain placeholders or offsets not found in the machine code of a completed program. The linker will use these placeholders and offsets to connect everything together.
Assembly code is plain-text and (somewhat) human read-able source code that mostly has a direct 1:1 analog with machine instructions. This is accomplished using mnemonics for the actual instructions, registers, or other resources. Examples include JMP and MULT for the CPU's jump and multiplication instructions. Unlike machine code, the CPU does not understand assembly code. You convert assembly code to machine code with the use of an assembler or a compiler, though we usually think of compilers in association with high-level programming language that are abstracted further from the CPU instructions.
๊ธฐ๊ณ์ด ์ฝ๋๋ ๊ทธ๋ฅ 1๊ณผ 0์ผ๋ก ์ด๋ฃจ์ด์ง ์ฝ๋, ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ ๊ทธ๋ฌํ ๊ธฐ๊ณ์ด ์ฝ๋๋ฅผ mov, push ์ ๊ฐ์ด ์ธ๊ฐ์ด ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ฐ๊พผ ์ ์์ค ์ฝ๋์ธ ๊ฑด ๋๋ถ๋ถ ์ฌ๋๋ค์ด ์์ค ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ค๊ฐ์ ์๋ ์ Object Code(์ค๋ธ์ ํธ ์ฝ๋)๋ ๋ญ๊น.....?
Object Code (์ค๋ธ์ ํธ ํ์ผ, ์ค๋ธ์ ํธ ์ฝ๋)
Object code๋ ์ต์ข ํ๋ก๊ทธ๋จ์ด ๋ง๋ค์ด์ง๊ธฐ ์ ์ ์์ง ๋งํฌ๋์ง ์์ ๊ธฐ๊ณ์ดํ์ผ์ด๋ค.
๋ค์์ add.S๋ผ๋ ์ด์ ๋ธ๋ฆฌ์ฝ๋๋ฅผ add.o๋ผ๋ ์ค๋ธ์ ํธ ํ์ผ๋ก ์ด์ ๋ธํ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ธ ๊ฒ์ด๋ค. (์ค๋ธ์ ํธ ํ์ผ ํ์ฅ์ : .o)
์ด์ ๋ธํ ๋๋ ์๋๊ฐ์ด gcc ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํ๊ณ as ์ด์ ๋ธ๋ฌ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
$ gcc -c add.S -o add.o
$ file add.o
add.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
$ hexdump -C add.o
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 01 00 3e 00 01 00 00 00 00 00 00 00 00 00 00 00 |..>.............|
00000020 00 00 00 00 00 00 00 00 10 02 00 00 00 00 00 00 |................|
00000030 00 00 00 00 40 00 00 00 00 00 40 00 0b 00 0a 00 |....@.....@.....|
00000040 55 48 89 e5 89 7d fc 89 75 f8 8b 55 fc 8b 45 f8 |UH...}..u..U..E.|
00000050 01 d0 5d c3 00 47 43 43 3a 20 28 55 62 75 6e 74 |..]..GCC: (Ubunt|
00000060 75 20 37 2e 35 2e 30 2d 33 75 62 75 6e 74 75 31 |u 7.5.0-3ubuntu1|
00000070 7e 31 38 2e 30 34 29 20 37 2e 35 2e 30 00 00 00 |~18.04) 7.5.0...|
00000080 14 00 00 00 00 00 00 00 01 7a 52 00 01 78 10 01 |.........zR..x..|
00000090 1b 0c 07 08 90 01 00 00 1c 00 00 00 1c 00 00 00 |................|
000000a0 00 00 00 00 14 00 00 00 00 41 0e 10 86 02 43 0d |.........A....C.|
000000b0 06 4f 0c 07 08 00 00 00 00 00 00 00 00 00 00 00 |.O..............|
์ด์ฒ๋ผ ์ค๋ธ์ ํธ ํ์ผ๋ ๊ธฐ๊ณ์ด์ ์ผ์ข ์ด๋ค!
gcc vs as ์ ๋๊ธ
GCC (GNU Compiler Collection)๋ ์ฌ๋ฌ ๊ฐ์ง ์ธ์ด (C, C++, Objective-C, Fortran, Ada, ๋ฑ)์ ์ปดํ์ผ์ ์ง์ํ๋ ์ปดํ์ผ๋ฌ์ด๋ฉฐ, ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ธฐ๋ฅ๋ ์๋ค.
๋ฐ๋ฉด์ as๋ ์ด์ ๋ธ๋ฌ(assembler)๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ, ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด ์ฝ๋๋ก ๋ณํํ๋ ์ญํ ์ ํฉ๋๋ค. as๋ GCC์ ์ผ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ GCC๋ฅผ ์ค์นํ๋ฉด ์๋์ผ๋ก as๋ ์ค์น๋๋ค.
as ๋ช ๋ น์ด ์ค๋ช
https://www.ibm.com/docs/en/aix/7.2?topic=program-assembling-as-command
๋งํฌ( Link)
ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ค๋ธ์ ํธ ํ์ผ์ด '๋งํฌ'ํ๊ธฐ ์ ํ์ผ์ด๋ผ๋ ๊ฒ์ ์ด์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ๋งํฌ๋ ๋ฌด์์ผ๊น??
๋งํฌ(Link)๋ "์ฌ๋ฌ ๋ชฉ์ ํ์ผ๋ค์ ์ฐ๊ฒฐ"ํ์ฌ ์ต์ข ์ ์ผ๋ก ์คํ ๊ฐ๋ฅํ ๋ฐ์ด๋๋ฆฌ๋ก ๋ง๋๋ ๊ณผ์ ์ด๋ค.
- ๊ทธ๋ฆผ 1๋ฒ์ ์ปดํ์ผ(compile)์ ํด๋นํ๋ค.
- ๊ทธ๋ฆผ 2๋ฒ์ ๋งํฌ(Link)์ ํด๋นํ๋ค.
- 1๋ฒ๊ณผ 2๋ฒ ๋๊ณผ์ ์ ํฉ์ณ์ ๋น๋(Build)๋ผ๊ณ ํ๋ค.
๊ทธ๋ฆผ ์ถ์ฒ : https://kimvampa.tistory.com/27
์๋ฅผ๋ค์ด ์ฐ๋ฆฌ๊ฐ ๋ง๋ C์ฝ๋์์ printf ํจ์๊ฐ ๋ฑ์ฅํ๋ค๊ณ ๊ฐ์ ํ์. ๊ทธ ์ฝ๋๋ฅผ ์ด์ ๋ธ๋ฆฌ์ด๋ก ๋ฐ๊พธ๋ฉด call printf ์ด๋ฐ ์ฝ๋๊ฐ ๋ฑ์ฅํ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ์ค๋ธ์ ํธ ํ์ผ๋ก ๋ง๋ค ๊ฒ์ด๋ค.
ํ์ง๋ง printf ํจ์์ ๋ด์ฉ์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ฝ๋์ ์กด์ฌํ์ง ์๋๋ค. ์ด๋ libc๋ผ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์กด์ฌํ๋ค.
์ด๋ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ฝ๋์ libc์ printfํจ์ ๋ถ๋ถ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋งํน(linking)ํ๋ค๊ณ ํ๋ ๊ฒ์ด๋ค!!! libc๋ gcc์ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒฝ๋ก์ ์๋๋ฐ, ๋ง์ปค๋ ๋ฐ์ด๋๋ฆฌ๊ฐ printf๋ฅผ ํธ์ถํ๋ฉด libc์ ํจ์๊ฐ ์คํ๋ ์ ์๋๋ก ์ฐ๊ฒฐํด ์ค๋ค!!
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๋งํฌ๋ฅผ ํด์ฃผ๋ ์์ด๋ฅผ ๋ง์ปค(Linker)๋ผ๊ณ ํ๋ค.
์ ์ ๋งํฌ์ ๋์ ๋งํฌ
๋งํฌ๋ ์ ์ ๋งํฌ(static link)์ ๋์ ๋งํฌ(dynamic link)๋ก ๋๋๋ค.
- ์ ์ ๋งํฌ : ์ปดํ์ผ๋ ์์คํ์ผ์ ์ฐ๊ฒฐํด์ ์คํ๊ฐ๋ฅํ ํ์ผ์ ๋ง๋๋ ๊ฒ -> ์คํํ์ผ์๋ค ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค ๋ณต์ฌํด์ ์คํํ์ผ ๋ง๋ฆ. ํ์ง๋ง ์คํ ํ์ผ ๋ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋๊ฐ ๋ค์ด๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ค์ง๊ฒ ์ก์๋จน์
- ๋์ ๋งํฌ : ํ๋ก๊ทธ๋จ ์คํ ๋์ค ํ๋ก๊ทธ๋จ ์ธ๋ถ์ ์กด์ฌํ๋ ์ฝ๋๋ฅผ ์ฐพ์์ ์ฐ๊ฒฐํ๋ ์์ .(๋์ ๋งํฌ๋ ๋ง์ปค๊ฐ ํ์๊ฐ ์๋ค.) ->๋ฉ๋ชจ๋ฆฌ ์๊ตฌ์ฌํญ์ด ํจ์ฌ ์ ์
์ด๋ฏธ์ง ์ถ์ฒ : https://codedragon.tistory.com/8461
๊ทธ๋ฌ๋๊น ์ ์ ๋งํฌ๋ ํ๋ก๊ทธ๋จ ๋ง๋ค๊ธฐ ์ ์ ์ด๋ฏธ ํ ํ์ผ์ ๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ ๋ค ํฌํจ ์ํค๋ ๊ฑฐ๊ณ , ๋์ ๋งํฌ๋ ์คํ์ค์ ๊ณ์ ๋์ ์ผ๋ก ์ฐธ์กฐํ๋๊ฒ์ ๋งํ๋ ๊ฒ๊ฐ๋ค.
์ ์ค๋ช ํด์ฃผ์ ์ฐธ๊ณ ํ ๋งํ ๊ธ : https://jhnyang.tistory.com/entry/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9CStatic-Linking-vs-Dynamic-Linkingshared-Library-%EC%A0%95%EC%A0%81%EB%A7%81%ED%82%B9-vs-%EB%8F%99%EC%A0%81%EB%A7%81%ED%82%B9
์ปดํ์ผ ๊ณผ์ ์ ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค!
References
https://kimvampa.tistory.com/27
'๐ฅ๏ธ Computer Science > System' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ROP ์๋ฆฌ์ฆ (1)] ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋งํฌ (0) | 2023.04.14 |
---|---|
[System/Assembly] ๋ฒ์ฉ ๋ ์ง์คํฐ ํธํํ (0) | 2023.04.03 |
[System] ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ (x64, x32, 64bit, 32bit) (0) | 2023.03.29 |
[Pwnable] ์์คํ ์ฝ(syscall), ์ ธ, ์ปค๋๋ชจ๋ vs ์ ์ ๋ชจ๋ (0) | 2023.03.26 |
[Assembly] ์ด์ ๋ธ๋ฆฌ์ด ํ์ ๋ช ๋ น์ด ์ ๋ฆฌ๋ณธ (์คํ ๊ด๋ จ) (0) | 2023.03.26 |