Program
์ฐ์ฐ์ฅ์น๊ฐ ์ํํ๋ ๋์์ ์ ์ํ ์ผ์ข ์ ๋ฌธ์!
์ฐ์ฐ ์ฅ์น์ ์ ๋ฌํ๋ฉด, CPU๋ ์ ํ์๋ ๋ช ๋ น๋ค์ ์ฒ๋ฆฌํ์ฌ ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋ํ ๋์ ์ํ
์ฌ์ฉ์๊ฐ ์ ์ํ ํ๋ก๊ทธ๋จ์ ํด์ํ์ฌ ๋ช ๋ น์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์ฐ์ฐ ์ฅ์น(programmable)
ํ๋ PC๋ ๋ํ์ programmable ์ฐ์ฐ์ฅ์น, ์ผ๋ฐ๊ณ์ฐ๊ธฐ๋ ๋ํ์ ์ธ non-programmable
์์ธํ ์ญ์ฌ๋ ์ ๋งํฌ๋ฅผ ๋ณด์๋ฉด ๋์, ๋ค ์ค๋ช ํ๊ธฐ ํ๋๋๊น ใ
๋ํ ๋ง์ ํ๋ก๊ทธ๋๋จธ๋ค์ ํ๋ก๊ทธ๋จ์ ๋ฐ์ด๋๋ฆฌ๋ผ๊ณ ๋ ๋ถ๋ฅด๋๋ฐ ์ด๋
"Stored-Program Computer์์ ํ๋ก๊ทธ๋จ์ด ์ ์ฅ ์ฅ์น์ ์ด์ง(Binary) ํํ๋ก ์ ์ฅ๋จ!"
์์ธํ ๋ด์ฉ์ ๋ณด์ค๊ฑฐ๋ฉด ๋ฐ์ ๋งํฌ๋ก ๋ค์ด๊ฐ์ ์ ์ด๋ฐ ๋ถ๋ถ๋ง ๋ณด์ธ์ ใ
Compile & Interpreter
์ฐ์ฐ์ฅ์น๊ฐ ์ํํ๋ ๋์์ ์ ์ํ ์ผ์ข ์ ๋ฌธ์!
ํ๋ก๊ทธ๋จ์ ์ ๊ธ์ธ์ด(์ด์ ๋ธ๋ฆฌ์ด ๋ฑ)์ ๊ณ ๊ธ์ธ์ด(C ๋ฑ)๋๋์ด์ง
์ปดํ์ผ๋ฌ(Compiler)
CPU๊ฐ ์ํํด์ผ ํ ๋ช ๋ น๋ค์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑํ ๊ฒ = ์์ค ์ฝ๋(Source Code)
์ด๋ฅผ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ๊ธฐ๊ณ์ด์ ํ์์ผ๋ก ๋ฒ์ญํ๋ ๊ฒ = ์ปดํ์ผ(Compile)
์ปดํ์ผ์ ํด์ฃผ๋ ์ํํธ์จ์ด๋ ์ปดํ์ผ๋ฌ(Compiler)๋ผ๊ณ ๋ถ๋ฆฌ๋๋ฐ, ๋ํ์ ์ผ๋ก GCC, Clang, MSVC!
ํ๋ฒ ์ปดํ์ผ๋๋ฉด ๊ฒฐ๊ณผ๋ฌผ์ด ํ๋ก๊ทธ๋จ์ผ๋ก ๋จ๊ธฐ ๋๋ฌธ์ ์ธ์ ๋ ์ง ์ด๋ฅผ ์คํํ์ฌ ๊ฐ์ ๋ช ๋ น์ ์ฒ๋ฆฌ๊ฐ๋ฅ!
๊ทธ๋ฌ๋ ๋ชจ๋ ์ธ์ด๊ฐ ์ปดํ์ผ์ด ํ์ํ๊ฑด ์๋๋ฉฐ, ๋ํ์ ์ผ๋ก Python, JavaScript ๋ฑ์ ์ธ์ด๊ฐ ์์ต๋๋ค.
์ธํฐํ๋ฆฌํฐ(Interpreter)
User(I/O, script) ๊ทธ๋๋ง๋ค ๋ฒ์ญํด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑํ ๊ฒ = ์ธํฐํ๋ฆฌํ (InterPreting)
์ธํฐํ๋ฆฌํ ์ ํด์ฃผ๋ ์ํํธ์จ์ด๋ ์ธํฐํ๋ฆฌํฐ(Interpreter)
์ฌ๊ธฐ์ ์๋์ฐ PE ๋ฐ์ด๋๋ฆฌ์ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง๋ง ๋ค๋ฃฌ๋ค๋ค์
๋ฐฐ๊ฒฝ์ง์์ผ๋ก C์์ค ์ฝ๋๊ฐ ์ด๋ป๊ฒ ์คํํ์ผ(PE)๋ก ๋๋ ์ง ํ์ธํฉ์๋ค.
Tip) ์๋์ฐ ์คํํ์ผ๋ก ์์ฑ ์ MSVC ์ฌ์ฉ์ด์ง๋ง linux๋ GCC๋ก ์ฌ์ฉ ๊ฐ๋ฅ
Compile ๊ณผ์
C๋ ์ ์ฒ๋ฆฌ → ์ปดํ์ผ → ์ด์ ๋ธ → ๋งํฌ ํ์์ผ๋ก ๋จ
์๋ ์ฝ๋๋ฅผ ํตํด ์ปดํ์ผ ํ์์ผ๋ก ํ์ธํด๋ณผ๊น์?
// 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);
์ปดํ์ผ ๊ณผ์ ์์ ์ปดํ์ผ
๐ก์ปดํ์ผ(Compile) : ์ด๋ค ์ธ์ด๋ก ์์ฑ๋ ์์ค์ฝ๋ → ๋ค๋ฅธ ์ธ์ด์ ๋ชฉ์ ์ฝ๋๋ก ๋ฒ์ญ!
์ด๋ฐ ๋งฅ๋ฝ์์ ์์ค ์ฝ๋ → ์ด์ ๋ธ๋ฆฌ์ด / ์์ค ์ฝ๋ → ๊ธฐ๊ณ์ด ๋ก ๋ฒ์ญํ๋ ๊ฑฐ ๋ชจ๋ ์ปดํ์ผ!
์ ์ฒ๋ฆฌ
์ปดํ์ผ๋ฌ๊ฐ ์์ค ์ฝ๋ → ์ด์ ๋ธ๋ฆฌ์ด๋ก ์ปดํ์ผํ๊ธฐ ์ ์, ํ์ํ ํ์์ผ๋ก ๊ฐ๊ณต ๊ณผ์
์ธ์ด๋ง๋ค ๋ค๋ฅด์ง๋ง ์ปดํ์ผ ์ธ์ด ๋๋ถ๋ถ์ ์ด์ ๊ฐ์ด ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์นจ
- ์ฃผ์ ์ ๊ฑฐ : ๊ฐ๋ฐ์๋ค์ ์ฝ๋ ์ดํด๋ฅผ ๋๋ ๋ฉ๋ชจ์ง
- ์ฃผ์์ ํ๋ก๊ทธ๋จ์ ๋์๊ณผ ์๊ด์ด ์์ผ๋ฏ๋ก ์ ์ฒ๋ฆฌ ๋จ๊ณ์์ ๋ชจ๋ ์ ๊ฑฐ - ๋งคํฌ๋ก ์นํ : #define ์ผ๋ก ์ ์ํ ๋ฉํฌ๋ก๋ ์์ฃผ ์ฐ๋ ์ฝ๋๋ ์์ซ๊ฐ์ ๋จ์ด๋ก ์ ์
- ์ ์ฒ๋ฆฌ ๊ณผ์ ์์ ๋งคํฌ๋ก์ ์ด๋ฆ์ ๊ฐ์ผ๋ก ์นํ - ํ์ผ ๋ณํฉ : ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋จ์ ์ฌ๋ฌ ๊ฐ์ ์์ค์ ํด๋ํ์ผ๋ก ๊ตฌ์ฑ
- ์ปดํ์ผ๋ฌ๋ ์ด๋ฅผ ๋ฐ๋ก ์ปดํ์ผํด ๋ณํฉํ์ง๋ง, ์ด๋ ํ ๊ฒฝ์ฐ๋ ์ ์ฒ๋ฆฌ ๋จ๊ณ์์ ํ์ผ์ ํฉ์น๊ณ ์ปดํ์ผ
gcc -E add.c > add.i ์ต์ ์ผ๋ก ์์ค ์ฝ๋์ ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธ ๊ฐ๋ฅ
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด
- ์ฃผ์์ธ //return a+b๊ฐ ์ฌ๋ผ์ง
- HI(์์)๊ฐ 3์ผ๋ก ์นํ๋จ
- add.h์ ๋ด์ฉ์ด #include์ ์ํด ๋ณํฉ๋จ(์ #๊ฐ์ด 0์ธ ์ ๋ค..)
์ปดํ์ผ(Compile)
C๋ก ์์๋ ์์ค ์ฝ๋๋ฅผ ์ด์ ๋ธ๋ฆฌ์ด๋ก ๋ฒ์ญํ๋ ๊ฒ
์ด ๊ณผ์ ์์ ์ปดํ์ผ๋ฌ๋ ์์ค ์ฝ๋์ ๋ฌธ๋ฒ์ ๊ฒ์ฌํ๋๋ฐ, ์ฝ๋์ ๋ฌธ๋ฒ์ ์ค๋ฅ ์ ์ปดํ์ผ์ ๋ฉ์ถ๊ณ ์๋ฌ ์ถ๋ ฅํจ
๋ํ, ๋ช๋ช ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ์ต์ ํ ๊ธฐ์ ์ ์ ์ฉํ ํจ์จ์ ์ธ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํจ
๐กTip. gcc์์๋ -O -O0 -O1 -O2 -O3 -Os -Ofast -Og ๋ฑ์ ์ต์ ์ ํตํด ์ต์ ํ ๊ฐ๋ฅ
์์๋ก ์๋ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด ์์ค๊ฒ๋๋ค. ์ต์ ํํ๋ฉด..
// 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);
}
์ปดํ์ผ๋ฌ๋ ๋ฐ๋ณต๋ฌธ์ ์ด์ ๋ธ๋ฆฌ์ด๋ก ์ฎ๊น X, ๋ฐ๋ณต๋ฌธ์ ๊ฒฐ๊ณผ๋ฅผ x๊ฐ ๊ฐ์ง ๊ฐ์ผ๋ก ์ง์ ๊ณ์ฐํ์ฌ, ์ด๋ฅผ ๋์ !
์ด๋ฅผ ํตํด ์ฌ์ฉ์ ์์ฑํ ์์ค ์ฝ๋์ ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ง๋ง, ์ต์ ํ๋ฅผ ํ์ฌ ์คํ์๊ฐ๋ ๋จ์ถํ๋ ์ด์ ๋ธ๋ฆฌ์ด ์ฝ๋ ์์ฑ!!
gcc -S add.i -o add.S
Tip) gcc -o ์คํํ์ผ๋ช ์ฝ๋ํ์ผ๋ช or gcc ์ฝ๋ํ์ผ๋ช -o ์คํํ์ผ๋ช
์๋์ ๊ฐ์ด "-S" ์ต์ ์ ์ด์ฉํ๋ฉด ์์ค ์ฝ๋๋ฅผ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ก ์ปดํ์ผํ ์ ์์!!
์ด์ ๋ธ
์ปดํ์ผ๋ก ์์ฑ๋ ์ด์ ๋ธ๋ฆฌ์ด ์ฝ๋๋ฅผ ELFํ์์ ๋ชฉ์ ํ์ผ๋ก ๋ณํ ๊ณผ์ !
๋ฆฌ๋ ์ค์ ์คํํ์ผ ํ์์ ELF / ์๋์ฐ๋ ๋ชฉ์ ํ์ผ์ PEํ์ผ
๋ชฉ์ ํ์ผ๋ก ๋ณํ๋๊ณ ๋๋ฉด ์ด์ ๋ธ๋ฆฌ ์ฝ๋๊ฐ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญ๋๊ธฐ์ ํด์์ด ๋ถ๊ฐํ์ฃ ..ใ
gcc -c add.S -o add.o
file add.o
hexdump -C add.o
๋ญ, ๊ทธ๋ ๋ค๊ณ ์ผ์ ์ ์๋ ์ฝ๋๊ฐ ๋์ค๋ ๊ฑด ์๋๊ธฐ์ 16์ง์๋ก ํ์ธ์ฉ์ผ๋ก..
๋์ ELF๋ผ๊ณ ์คํ ํ์ผ์ด๋ผ๊ณ ๋จ๊ณ ๋ฒ์ ๋ฐ ํ๊ฒฝ ๊ทธ๋ฆฌ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋ณด์ ์กฐ๊ฑด ๋ค ๋์ค์ฃ ใ
๋งํฌ
์ฌ๋ฌ ๋ชฉ์ ํ์ผ๋ค์ ์ฐ๊ฒฐํ์ฌ ์คํ ๊ฐ๋ฅํ ๋ฐ์ด๋๋ฆฌ๋ก ๋ง๋๋ ๊ณผ์
๋งํฌ๊ฐ ํ์ํ ์ด์ ๋ฅผ ๋ค์ ์ฝ๋๋ก ๋ณด์ฌ๋๋ฆด๊ป์
// 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ํจ์๋ฅผ ์ฐพ๋๋ฐ ์ฌ๊ธฐ์ ์์ผ๋..
์๋ฌ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด --unresolved-symbols๋ฅผ ์ปดํ์ผ ์ต์ ์ ์ถ๊ฐํด์
์ฐธ๊ณ ๋ก linker๋ ์ฐ๊ธฐ ํ๋ค ์ ์๋๋ฐ.. ์ด๋ ์ฌ๋ณผ๋ช ์ ์ฐพ์ ์ ์๋์ง๋ ๊ณต์ ๋ฌธ์์์ ํ์ธํด๊ฐ๋ฉฐ, ์ฝ๋ ๊ธฐ์ ..ใ
gcc add.o -o add -Xlinker --unresolved-symbols
file add
๋์ค์ด์ ๋ธ(๋์ ๋ธ) & ๋์ปดํ์ผ
๋์ค์ด์ ๋ธ(Disassemble) : ์ด์ ๋ธ๋ฆฌ์ด๋ฅผ ์ฌ๋ฒ์ญํ๋ ๊ณผ์ ์ผ๋ก ์ด์ ๋ธ์ ์ญ๊ณผ์
๋์ปดํ์ผ๋ฌ(Decompiler) : ์ด์ ๋ธ๋ฆฌ์ด๋ณด๋ค ๊ณ ๊ธ ์ธ์ด๋ก ๋ฐ์ด๋๋ฆฌ ๋ฒ์ญ
ํ์ ๋ฐฐ๊ฒฝ
๋์ค์ด์ ๋ธ(Disassemble)์ ํ์๋ฐฐ๊ฒฝ
๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ถ์ํ๋ ค๋ฉด ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฝ์ด์ผํ๋ ๊ฒ์ฒ๋ผ ์ปดํ์ผ๋ ํ๋ก๊ทธ๋จ ์ฝ๋๋
๊ธฐ๊ณ์ด๋ก ๋์ด ์๊ธฐ์ ์ดํดํ๊ธฐ ์ด๋ ค์ฐ๋ฏ๋ก, ๋ถ์๊ฐ๋ค์ ์ด์ ๋ธ๋ฆฌ์ด๋ฅผ ์ฌ๋ฒ์ญํด ๋ถ์ํ๊ธฐ ์ํจ!
๋์ปดํ์ผ๋ฌ(Decompiler)
๋์ ๋ธ์ ๊ธฐ์ ๋ก ๋ฐ์ด๋๋ฆฌ ๋ถ์์ด ์ด์ ๋ณด๋ค ์ฉ์ดํด์ก์ผ๋, ๊ท๋ชจ๊ฐ ํฐ ๋ฐ์ด๋๋ฆฌ์์ ...
๊ทธ๋์ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ค์ ์ด์ ๋ธ๋ฆฌ์ด๋ณด๋ค ๊ณ ๊ธ ์ธ์ด๋ก ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ถ์ํ๊ธฐ๋ก ํด ๊ฐ๋ฐ!
์ด์ ๋ธ๋ฆฌ์ด์ ๊ธฐ๊ณ์ด๋ ๊ฑฐ์ 1๋1๋ก ๋์๋์ด ์ค์ฐจ์๋ ๋์ ๋ธ์ ๊ฐ๋ฐ๊ฐ๋ฅํ๋, ๊ณ ๊ธ์ธ์ด์ ์ด์ ๋ธ๋ฆฌ์ด ์ฌ์ด์ ์ด๋ฐ ๋์๊ด๊ณ๊ฐ ์์ด์.. ๋ํ ์ฝ๋์ ์ผ๋ถ๋ถ์ ์ต์ ํ๋ก ์์ ํ ๋ณ์๋์ฃ
์ด๋ฐ ์ด๋ ค์ ๋๋ฌธ์ ๋ถ์ ํจ์จ์ ๋์๋ผ๋ฉด ๋์ ๋ธ์ด ์ ๋ฆฌํ์ฃ ํนํ ์์ฆ์ Hex Rays, Ghidra๋ฅผ ๋น๋กฏํ ๋ฐ์ด๋ ๋์ปดํ์ผ๋ฌ๋ค์ด ๊ฐ๋ฐ๋์ด ๋ถ์์ ํจ์จ๋ ๋์ฌ์ฃผ์ด์
์ ๋ฆฌ
- ํ๋ก๊ทธ๋จ : ์ปดํจํฐ๊ฐ ์คํํด์ผ ํ ๋ช ๋ น์ด์ ์งํฉ, ๋ฐ์ด๋๋ฆฌ๋ผ๊ณ ๋ ๋ถ๋ฆผ
- ์ ์ฒ๋ฆฌ : ์์ค ์ฝ๋๊ฐ ์ปดํ์ผ์ ํ์ํ ํ์์ผ๋ก ๊ฐ๊ณต๋๋ ๊ณผ์
- ์ปดํ์ผ : ์์ค ์ฝ๋๋ฅผ ์ด์
๋ธ๋ฆฌ์ด๋ก ๋ฒ์ญํ๋ ๊ณผ์
- ์ด์ ๋ธ : ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๊ณ , ์คํ ๊ฐ๋ฅํ ํ์์ ๋ณํํ๋ ๊ณผ์
- ๋งํฌ : ์ฌ๋ฌ ๊ฐ์ ๋ชฉ์ ํ์ผ์ ํ๋๋ก ๋ฌถ๊ณ , ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐ๊ฒฐํด์ฃผ๋ ๊ณผ์
- ๋์
๋ธ : ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ด์
๋ธ๋ฆฌ์ด๋ก ๋ฒ์ญํ๋ ๊ณผ์
- ๋์ปดํ์ผ: ๋ฐ์ด๋๋ฆฌ๋ฅผ ๊ณ ๊ธ ์ธ์ด๋ก ๋ฒ์ญํ๋ ๊ณผ์
gcc ์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
์ถ์ฒ
'๐โSystem_Study > ๐โDreamhack_Reversing' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
rev-basic-0 (0) | 2022.05.17 |
---|---|
Exercise: Helloworld (0) | 2022.05.16 |
x86 Assembly (0) | 2022.05.12 |
Computer Science (0) | 2022.05.12 |
Background: Static Analysis vs. Dynamic Analysis (0) | 2022.05.11 |