ํ๋ก๊ทธ๋จ๐
ํ๋ก๊ทธ๋จ Program : ์ฐ์ฐ ์ฅ์น๊ฐ ์ํํด์ผ ํ๋ ๋์์ ์ ์ํ ์ผ์ข ์ ๋ฌธ์
ํ๋ก๊ทธ๋จ์ ์ฐ์ฐ ์ฅ์น์ ์ ๋ฌ → CPU๋ ์ ํ์๋ ๋ช ๋ น์ ์ฒ๋ฆฌํด ์๋ํ ๋์์ ์ํ
๋ฐ์ด๋๋ฆฌ Binary == ํ๋ก๊ทธ๋จ Program
์ปดํ์ผ๋ฌ์ ์ธํฐํ๋ฆฌํฐ
Programming Language ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ์ธ์ด ( ๊ณ ๊ธ์ธ์ด / ์ ๊ธ์ธ์ด)
| Source Code | CPU๊ฐ ์ํํด์ผ ํ ๋ช ๋ น๋ค์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑํ ๊ฒ |
| Compile | ์์ค์ฝ๋๋ฅผ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋๋ก ๊ธฐ๊ณ์ด์ ํ์์ผ๋ก ๋ฒ์ญํ๋ ๊ฒ, ์ ํํ ์๋ฏธ๋ก๋ ์ด๋ค ์ธ์ด๋ก ์์ฑ๋ ์์ค ์ฝ๋(Source Code)๋ฅผ ๋ค๋ฅธ ์ธ์ด์ ๋ชฉ์ ์ฝ๋(Object Code)๋ก ๋ฒ์ญํ๋ ๊ฒ |
| Compiler | ์ปดํ์ผ์ ํด์ฃผ๋ ์ํํธ์จ์ด ex) GCC, Clang, MSVC |
| Interpreting | ์ฌ์ฉ์์ ์ ๋ ฅ, ๋๋ ์ฌ์ฉ์๊ฐ ์์ฑํ ์คํฌ๋ฆฝํธ๋ฅผ ๊ทธ๋ ๊ทธ๋ ๋ฒ์ญํ์ฌ CPU์ ์ ๋ฌํ๋ ๊ณผ์ |
| Interpreter | ์ธํฐํ๋ฆฌํ ์ ์ฒ๋ฆฌํด์ฃผ๋ ํ๋ก๊ทธ๋จ |
์ปดํ์ผ ๊ณผ์
Preprocess(์ ์ฒ๋ฆฌ) → Compile(์ปดํ์ผ) → Assemble(์ด์ ๋ธ) → Link(๋งํฌ) ⇒ c์ธ์ด ์ปดํ์ผ ๊ณผ์
1. Preprocess (์ ์ฒ๋ฆฌ)
- ์ปดํ์ผ๋ฌ๊ฐ ์์ค ์ฝ๋๋ฅผ ์ด์
๋ธ๋ฆฌ์ด๋ก ์ปดํ์ผํ๊ธฐ ์ ์, ํ์ํ ํ์์ผ๋ก ๊ฐ๊ณตํ๋ ๊ณผ์
- ์ฃผ์ ์ ๊ฑฐ
- ๋งคํฌ๋ก ์นํ
- #define์ผ๋ก ์ ์๋ ๋งคํฌ๋ก๋ค์ ๊ฐ์ผ๋ก ์นํ๋จ.
- ํ์ผ ๋ณํฉ
$ gcc -E add.c > add.i -E ์ต์ ์ ์ฌ์ฉํ๋ฉด ์์ค ์ฝ๋์ ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์
2. Compile (์ปดํ์ผ)
- C๋ก ์์ฑ๋ ์์ค ์ฝ๋๋ฅผ ์ด์ ๋ธ๋ฆฌ์ด๋ก ๋ฒ์ญํ๋ ๊ฒ
- ๋ฒ์ญํ๋ ๊ณผ์ ์์ ์์ค์ฝ๋์ ๋ฌธ๋ฒ์ ๊ฒ์ฌํจ → ์ค๋ฅ ๋ฐ์์ ์๋ฌ ์ถ๋ ฅ
- ์ต์ ํ ๊ธฐ์ ์ ์ ์ฉํ์ฌ ํจ์จ์ ์ธ ์ด์ ๋ธ๋ฆฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์๋ ์์
- ์๋ฅผ ๋ค์ด, ์ต์ ํํ์ฌ ์ปดํ์ผํ๋ฉด, ์ปดํ์ผ๋ฌ๋ ๋ฐ๋ณต๋ฌธ์ ์ด์ ๋ธ๋ฆฌ์ด๋ก ์ฎ๊ธฐ๋ ๊ฒ์ด ์๋๋ผ, ๋ฐ๋ณต๋ฌธ์ ๊ฒฐ๊ณผ๋ก x๊ฐ ๊ฐ์ง ๊ฐ์ ์ง์ ๊ณ์ฐํ์ฌ, ์ด๋ฅผ ๋์ ํ๋ ์ฝ๋๋ฅผ ์์ฑํจ
$ gcc -S add.i -o add.S
$ cat add.S
-S ์ต์
์ ์ด์ฉํ๋ฉด ์์ค ์ฝ๋๋ฅผ ์ด์
๋ธ๋ฆฌ ์ฝ๋๋ก ์ปดํ์ผํ ์ ์๋ค.
3. Assemble (์ด์ ๋ธ)
- ์ปดํ์ผ๋ก ์์ฑ๋ ์ด์ ๋ธ๋ฆฌ์ด ์ฝ๋๋ฅผ ELF ํ์์ Object ํ์ผ๋ก ๋ณํํ๋ ๊ณผ์
- ELF๋ ๋ฆฌ๋ ์ค์ ์คํํ์ผ ํ์
- ์๋์ฐ์์ ์ด์ ๋ธํ๋ค๋ฉด Object ํ์ผ์ PE ํ์์ ๊ฐ๊ฒ ๋จ
- Object ํ์ผ๋ก ๋ณํ๋๊ณ ๋๋ฉด ์ด์ ๋ธ๋ฆฌ ์ฝ๋๊ฐ ๊ธฐ๊ณ์ด๋ก ๋ณ์ญ๋๋ฏ๋ก ๋์ด์ ์ฌ๋์ด ๋ฒ์ญํ๊ธฐ ์ด๋ ค์์ง
$ gcc -c add.S -o add.o
-c ์ต์
์ ํตํด์ Object ํ์ผ๋ก ์ด์
๋ธ ํ ์ ์์
4. Link (๋งํฌ)
- ์ฌ๋ฌ Object ํ์ผ์ ์ฐ๊ฒฐํ์ฌ ์คํ ๊ฐ๋ฅํ ๋ฐ์ด๋๋ฆฌ(ํ๋ก๊ทธ๋จ)์ผ๋ก ๋ง๋๋ ๊ณผ์
$ gcc add.o -o add -Xlinker --unresolved-symbols=ignore-in-object-files
mainํจ์์ ์ ์๊ฐ ์์ผ๋ฏ๋ก ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์์.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด --unresolved-symbols๋ฅผ ์ปดํ์ผ ์ต์
์ ์ถ๊ฐ
Disassemble (๋์ค์ด์ ๋ธ)
- ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ฅผ ์ด์ ๋ธ๋ฆฌ์ด๋ก ๋ฒ์ญํ๋ ๊ณผ์
- Binary Code → Assembly Code → Source Code
Decompile (๋์ปดํ์ผ)
- ๊ณ ๊ธ ์ธ์ด๋ก ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ฒ์ญํ๋ ๊ณผ์
- ์ด์ ๋ธ๋ฆฌ์ด์ ๊ธฐ๊ณ์ด๋ ๊ฑฐ์ ์ผ๋์ผ๋ก ๋์๋์ด์ ์ค์ฐจ๊ฐ ์์
- ๊ณ ๊ธ ์ธ์ด์ ์ด์ ๋ธ๋ฆฌ์ด ์ฌ์ด์๋ ์ด๋ฐ ๋์ ๊ด๊ณ๊ฐ ์์
- ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํ๋ ๋ณ์๋ ํจ์์ ์ด๋ฆ ๋ฑ์ ์ปดํ์ผ ๊ณผ์ ์์ ์ ๋ถ ์ฌ๋ผ์ง๊ณ , ์ฝ๋์ ์ผ๋ถ๋ถ์ ์ต์ ํ์ ๊ฐ์ ์ด์ ๋ก ์ปดํ์ผ๋ฌ์ ์ํด ์์ ํ ๋ณํ๋๊ธฐ๋ ํจ.
'Reversing > Dreamhack : Reverse Engineering' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Quiz: x86 Assembly 1 (0) | 2025.04.16 |
|---|---|
| x86 Assembly๐ค: Essential Part (0) | 2025.04.16 |
| Background: Windows Memory Layout (0) | 2025.04.16 |
| Background: Computer Architecture (0) | 2025.04.16 |
| Background: Static Analysis vs. Dynamic Analysis (0) | 2025.04.16 |