
1. ํ๋ก๊ทธ๋จ๊ณผ ์ปดํ์ผ โ
ํ๋ก๊ทธ๋จ (Program)๐
: ์ฐ์ฐ ์ฅ์น๊ฐ ์ํํด์ผ ํ๋ ๋์์ ์ ์ํ ์ผ์ข ์ ๋ฌธ์์ด๋ค.
ํ๋ก๊ทธ๋จ์ ์ฐ์ฐ ์ฅ์น์ ์ ๋ฌํ๋ฉด, CPU๋ ์ ํ์๋ ๋ช ๋ น๋ค์ ์ฒ๋ฆฌํ์ฌ ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋ํ
๋์์ ์ํํ๋ค.
* ์ฌ์ฉ์๊ฐ ์ ์ํ ํ๋ก๊ทธ๋จ์ ํด์ํ์ฌ ๋ช ๋ น์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์ฐ์ฐ ์ฅ์น๋ฅผ programmableํ๋ค๊ณ
ํ๋ค. ํ๋์ ์ปดํจํฐ๊ฐ ๋ํ์ ์ธ programmable ์ฐ์ฐ ์ฅ์น, ์ผ๋ฐ ๊ณ์ฐ๊ธฐ ๋ํ์ ์ธ non-programmable ์ฐ์ฐ์ฅ์น
โ
· ๊ณผ๊ฑฐ์๋ ๋ด๋ถ ์ ์ฅ ์ฅ์น์ ์ ์ฅํ ์ ์์ด์ ์ฌ๋์ด ์ ์ ์ ์ฐ๊ฒฐํ์ฌ ์ปดํจํฐ์ ์ ๋ฌํจ - ์ ๋์ (ENIAC)
--> ๋งค์ฐ ๋นํจ์จ์ ์ด๋ฉฐ, ํฌ๊ธฐ๊ฐ ํฐ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๊ธฐ๋ ์ด๋ ค์ ๋ค.
โถ ์ด๋ฌํ ๋จ์ ์ ํด๊ฒฐํ Stored-Program Computer๊ฐ 1950๋ ์ ์ต์ด๋ก ์์ฉํ๋์๋ค.
→ ๊ธฐ์กด์ ์ปดํจํฐ๋ค๋ณด๋ค ์๋ฑํ ๋ง์ ํ๋ก๊ทธ๋จ์ ์ ์ฅํ ์ ์์๊ณ , ์ ์ฅ๋ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐํธํ๋ค.
→ ์ด์ ๋ ๋๋ถ๋ถ์ ์ปดํจํฐ๊ฐ Stored-Program Computer ํํ๋ก ๊ฐ๋ฐ๋๋ค.
โ
· Stored-Program Computer์์๋ ํ๋ก๊ทธ๋จ์ด ์ ์ฅ์ฅ์น์ ์ด์ง(Binary) ํํ๋ก ์ ์ฅ๋๋ค.
→ ์์ง๋์ด๋ค์ด ํ๋ก๊ทธ๋จ์ ๋ฐ์ด๋๋ฆฌ(Binary)๋ผ๊ณ ๋ถ๋ฅด๊ณค ํ๋ค.
โ
โ
โ
โ
์ปดํ์ผ๋ฌ์ ์ธํฐํ๋ฆฌํฐ
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด (Programming Language)
: ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ธ์ด
- C, C++, Go, Rust์ ๊ฐ์ ๊ณ ๊ธ์ธ์ด๋ค๊ณผ ์ด์ ๋ธ๋ฆฌ์ด, ๊ธฐ๊ณ์ด ๋ฑ์ ์ ๊ธ ์ธ์ด๋ค์ด ์๋ค.
โ
์์ค ์ฝ๋ (Source Code)
: CPU๊ฐ ์ํํด์ผ ํ ๋ช ๋ น๋ค์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑํ ๊ฒ
โ
์ปดํ์ผ (Compile)
: ์์ค ์ฝ๋๋ฅผ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ๊ธฐ๊ณ์ด์ ํ์์ผ๋ก ๋ฒ์ญํ๋ ๊ฒ
โ
์ปดํ์ผ๋ฌ (Compiler)
: ์ปดํ์ผ์ ํด์ฃผ๋ ์ํํธ์จ์ด ex) GCC, Clang, MSVC
โ
* Python, Javascript ๋ฑ์ ์ธ์ด๋ ์ปดํ์ผ์ ํ์๋ก ํ์ง ์๋๋ค.
- ์ด ์ธ์ด๋ค์ ์ฌ์ฉ์์ ์ ๋ ฅ, ์ฌ์ฉ์๊ฐ ์์ฑํ ์คํฌ๋ฆฝํธ๋ฅผ ๊ทธ๋ ๊ทธ๋ ๋ฒ์ญํ์ฌ CPU์ ์ ๋ฌํจ
-> ์ด ๋์์ด ํต์ญ๊ณผ ๋น์ทํ์ฌ ์ธํฐํ๋ฆฌํ (Interpreting) ์ด๋ผ๊ณ ๋ถ๋ฅด๊ณ ,
์ด๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ํ๋ก๊ทธ๋จ์ ์ธํฐํ๋ฆฌํฐ (Interpreter) ๋ผ๊ณ ํ๋ค.
โ
โ
โ
โ
์ปดํ์ผ ๊ณผ์
- C์ธ์ด๋ก ์์ฑ๋ ์ฝ๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฒ๋ฆฌ(Preprocess), ์ปดํ์ผ(Compile), ์ด์ ๋ธ(Assemble), ๋งํฌ(Link)์ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ฐ์ด๋๋ผ๊ณ ๋ฒ์ญ๋๋ค.
โ
โป ์ปดํ์ผ ๊ณผ์ ์ ์ปดํ์ผ
์ปดํ์ผ(Compile)์ ์ ํํ ์๋ฏธ๋ ์ด๋ค ์ธ์ด๋ก ์์ฑ๋ ์์ค ์ฝ๋(Source Code)๋ฅผ ๋ค๋ฅธ ์ธ์ด์ ๋ชฉ์ ์ฝ๋(Object Code)๋ก ๋ฒ์ญํ๋ ๊ฒ์ด๋ค.
์์ค ์ฝ๋๋ฅผ ์ด์ ๋ธ๋ฆฌ์ด๋ก, ์์ค ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๋ ๊ฒ ๋ชจ๋ ์ปดํ์ผ์ด๋ค.
โ
โ
โ
โ
์ ์ฒ๋ฆฌ (Preprocessing)
: ์ปดํ์ผ๋ฌ๊ฐ ์์ค ์ฝ๋๋ฅผ ์ด์ ๋ธ๋ฆฌ์ด๋ก ์ปดํ์ผ ํ๊ธฐ ์ ์, ํ์ํ ํ์์ผ๋ก ๊ฐ๊ณตํ๋ ๊ณผ์
โ
์ ์ฒ๋ฆฌ ๊ณผ์
โ ์ฃผ์ ์ ๊ฑฐ
: ์ฃผ์์ ํ๋ก๊ทธ๋จ์ ๋์๊ณผ ์๊ด์ด ์์ผ๋ฏ๋ก ์ ์น๋ฆฌ ๊ณผ์ ์์ ๋ชจ๋ ์ ๊ฑฐ๋จ
โก ๋งคํฌ๋ก ์นํ
: ์ ์ฒ๋ฆฌ ๊ณผ์ ์์ ๋งคํฌ๋ก(#define)์ ์ด๋ฆ์ ๊ฐ์ผ๋ก ์นํ๋๋ค.
โข ํ์ผ ๋ณํฉ
: ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋จ์ ์ฌ๋ฌ ๊ฐ์ ์์ค์ ํค๋ ํ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. -> ๋ฐ๋ก ์ปดํ์ผํด์ ํฉ์น๊ธฐ๋ ํ์ง๋ง ์ ์ฒ๋ฆฌ ๋จ๊ณ์์ ํ์ผ์ ํฉ์น๊ณ ์ปดํ์ผํ๊ธฐ๋ ํจ
// Name: add.c
#include "add.h"
#define HI 3
int add(int a, int b) { return a + b + HI; } // return a+b
// Name: add.h
int add(int a, int b);

gcc์์๋ -E์ต์ ์ ์ฌ์ฉํ์ฌ ์์ค ์ฝ๋์ ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.
๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ณด๋ฉด ์์ค ์ฝ๋์ ์ฃผ์์ธ // return a+b๊ฐ ์ฌ๋ผ์ก๊ณ , HI๊ฐ 3์ผ๋ก ์นํ๋์๋ค.
๊ทธ๋ฆฌ๊ณ add.h์ ๋ด์ฉ์ด #include๋ก ์ธํด ๋ณํฉ๋จ์ ํ์ธํ ์ ์๋ค.
โ
โ
โ
โ
โ
์ปดํ์ผ
// Name: opt.c
// Compile: gcc -o opt opt.c -O2
#include <stdio.h>
int main() {
int x = 0;
for (int i = 0; i < 100; i++) x += i; // x์ 0๋ถํฐ 99๊น์ง์ ๊ฐ ๋ํ๊ธฐ
printf("%d", x);
}


์์ ๊ฐ์ด -02 ์ต์ ์ ์ฌ์ฉํด์ opt.c๋ฅผ ์ต์ ํํ์ฌ ์ปดํ์ผํ๋ฉด, ์ปดํ์ผ๋ฌ๋ ๋ฐ๋ณต๋ฌธ์ ์ด์ ๋ธ๋ฆฌ์ด๋ก ์ฏ๊ธฐ๋ ๊ฒ์ด ์๋๋ผ, ๋ฐ๋ณต๋ฌธ์ ๊ฒฐ๊ณผ๋ก x๊ฐ ๊ฐ์ง ๊ฐ์ ์ง์ ๊ณ์ฐํ์ฌ, ์ด๋ฅผ ๋์ ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
์ต์ ํ๋ฅผ ํ๊ฒ๋๋ฉด ์ต์ ํ๋ฅผ ์ ์ฉํ์ง ์์์ ๋๋ณด๋ค ๋ ์งง๊ณ , ์คํ ์๊ฐ๋ ๋ ๋จ์ถ๋๋ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๊ฐ ๋ง๋ค์ด์ง๋ค.
โ

์์ ๊ฐ์ด "-S" ์ต์ ์ ์ด์ฉํ๋ฉด ์์ค ์ฝ๋๋ฅผ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ก ์ปดํ์ผํ ์ ์๋ค.
โ
โ
โ
โ
โ
์ด์ ๋ธ (Assemble)
: ์ปดํ์ผ๋ก ์์ฑ๋ ์ด์ ๋ธ๋ฆฌ์ด ์ฝ๋๋ฅผ ELFํ์์ ๋ชฉ์ ํ์ผ(Object file)๋ก ๋ณํํ๋ ๊ณผ์ ์ด๋ค.
๋ชฉ์ ํ์ผ๋ก ๋ณํ๋๊ณ ๋๋ฉด ์ด์ ๋ธ๋ฆฌ ์ฝ๋๊ฐ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญ๋๋ฏ๋ก ๋์ด์ ์ฌ๋์ด ํด์ํ๊ธฐ ์ด๋ ค์์ง๋ค.
โ
* ELF : ๋ฆฌ๋ ์ค์ ์คํํ์ผ ํ์
์๋์ฐ์์ ์ด์ ๋ธํ๋ฉด ๋ชฉ์ ํ์ผ์ PEํ์

์ ์ฌ์ง์ gcc์ "-c" ์ต์ ์ ํตํด add.S๋ฅผ ๋ชฉ์ ํ์ผ๋ก ๋ณํํ๊ณ , ๊ฒฐ๊ณผ๋ก ๋์จ ํ์ผ์ hexdump ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ 16์ง์๋ก ์ถ๋ ฅํ ๊ฒ์ด๋ค. ์ฝ์ ์ ์๋ ๋ฌธ์์ด ์ค ์ฝ๋๋ก ๋ณด์ด๋ ๊ฒ์ ์๋ค.
โ
โ
โ
โ
๋งํฌ (Link)
: ์ฌ๋ฌ ๋ชฉ์ ํ์ผ๋ค์ ์ฐ๊ฒฐํ์ฌ ์คํ ๊ฐ๋ฅํ ๋ฐ์ด๋๋ฆฌ๋ก ๋ง๋๋ ๊ณผ์ ์ด๋ค.
// Name: hello-world.c
// Compile: gcc -o hello-world hello-world.c
#include <stdio.h>
int main() { printf("Hello, world!"); }
๋ค์ ์ฝ๋์์ printf ํจ์๋ฅผ ํธ์ถํ์ง๋ง, printfํจ์์ ์ ์๋ hello-world.c์ ์์ผ๋ฉฐ, libc๋ผ๋ ๊ณต์
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์กด์ฌํ๋ค. libc๋ gcc์ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒฝ๋ก์ ์๋๋ฐ, ๋ง์ปค๋ ๋ฐ์ด๋๋ฆฌ๊ฐ printf๋ฅผ ํธ์ถํ๋ฉด libc์ ํจ์๊ฐ ์คํ๋ ์ ์๋๋ก ์ฐ๊ฒฐํด์ค๋ค. ๋งํฌ๋ฅผ ๊ฑฐ์น๊ณ ๋๋ฉด ์คํํ ์ ์๋ ํ๋ก๊ทธ๋จ์ด ์์ฑ๋๋ค.
โ

๋ค์์ add.o๋ฅผ ๋งํฌํ๋ ๋ช ๋ น์ด์ด๋ค.
๋งํฌํ๋ ๊ณผ์ ์์ ๋ง์ปค๋ mainํจ์๋ฅผ ์ฐพ๋๋ฐ, add์ ์์ค์ฝ๋์๋ mainํจ์์ ์ ์๊ฐ ์์ผ๋ฏ๋ก ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด --unresolved-stmbols๋ฅผ ์ปดํ์ผ ์ต์ ์ ์ถ๊ฐํด์ฃผ์๋ค.
โ
โ
2. ๋์ค์ด์ ๋ธ๊ณผ ๋์ปดํ์ผ

๋์ค์ด์ ๋ธ (Disassemble)
: ๊ธฐ๊ณ์ด๋ฅผ ์ด์ ๋ธ๋ฆฌ์ด๋ก ์ฌ๋ฒ์ญํ์ ํ๋ ๊ณผ์ -> ์ด์ ๋ธ์ ์ญ๊ณผ์ ์ด๋ฏ๋ก ๋์ค์ด์ ๋ธ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
โ

์์ ๋ช ๋ น์ด๋ก ๋์ค์ด์ ๋ธ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.
โ
โ
โ
โ
๋์ปดํ์ผ
: ๋ฐ์ด๋๋ฆฌ๋ฅผ ๊ณ ๊ธ ์ธ์ด๋ก ๋ฒ์ญํ๋ ๊ณผ์
โ
* ๋์ปดํ์ผ๋ฌ (Decompiler)
-> ์ด์ ๋ธ๋ฆฌ์ด๋ณด๋ค ๊ณ ๊ธ์ธ์ด๋ก ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ฒ์ญํจ
๋์ปดํ์ผ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ด๋๋ฆฌ์ ์์ค ์ฝ๋์ ๋์ผํ ์ฝ๋๋ฅผ ์์ฑํ์ง๋ ๋ชปํ๋ค.
๊ทธ๋ฌ๋, ์ด ์ค์ฐจ๊ฐ ๋ฐ์ด๋๋ฆฌ์ ๋์์ ์๊ณกํ์ง๋ ์์ผ๋ฉฐ, ๋์ค์ด์ ๋ธ๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์๋์ ์ผ๋ก ๋ถ์ ํจ์จ์ ๋์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ๋์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ๋ฆฌํ๋ค.
'DreamHack > Reversing (Dreamhack)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Reversing] 3์ฃผ์ฐจ dreamhack stage 3 (0) | 2022.05.08 |
---|---|
[Reversing] 2์ฃผ์ฐจ_dreamhack stage 3 - (1) (0) | 2022.04.30 |
[Reversing] 2์ฃผ์ฐจ dreamhack stage 3 (0) | 2022.04.30 |
[System Hacking] 1์ฃผ์ฐจ dreamhack stage 2 - (1) (0) | 2022.04.07 |
[Reversing] 1์ฃผ์ฐจ dreamhack stage 1 (0) | 2022.04.07 |