๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Reversing/Dreamhack : Reverse Engineering

Background : Binary

ํ”„๋กœ๊ทธ๋žจ๐Ÿ“’

ํ”„๋กœ๊ทธ๋žจ 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 (์ „์ฒ˜๋ฆฌ)

  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ์ปดํŒŒ์ผํ•˜๊ธฐ ์ „์—, ํ•„์š”ํ•œ ํ˜•์‹์œผ๋กœ ๊ฐ€๊ณตํ•˜๋Š” ๊ณผ์ •
    1. ์ฃผ์„ ์ œ๊ฑฐ
    2. ๋งคํฌ๋กœ ์น˜ํ™˜
      • #define์œผ๋กœ ์ •์˜๋œ ๋งคํฌ๋กœ๋“ค์€ ๊ฐ’์œผ๋กœ ์น˜ํ™˜๋จ.
    3. ํŒŒ์ผ ๋ณ‘ํ•ฉ
    $ 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