1. 정적 뢄석 (Static Analysis)

: ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€μ§€ μ•Šκ³  λΆ„μ„ν•˜λŠ” 방법

​

정적 λΆ„μ„μ˜ μž₯점 πŸ‘

- ν”„λ‘œκ·Έλž¨μ˜ 전체 ꡬ쑰λ₯Ό νŒŒμ•…ν•˜κΈ° 쉽닀.

- 뢄석 ν™˜κ²½μ˜ μ œμ•½μ—μ„œλ„ 비ꡐ적 μžμœ λ‘­λ‹€.

· 뢄석을 μ§€μ›ν•˜λŠ” μ μ ˆν•œ λ„κ΅¬λ§Œ κ°–μΆ˜λ‹€λ©΄ μ‹œλ„ κ°€λŠ₯

- λ°”μ΄λŸ¬μŠ€μ™€ 같은 μ•…μ„± ν”„λ‘œκ·Έλž¨μ˜ μœ„ν˜‘μœΌλ‘œλΆ€ν„° μ•ˆμ „ν•˜λ‹€.

​

정적 λΆ„μ„μ˜ 단점 πŸ‘Ž

- ν”„λ‘œκ·Έλž¨μ— λ‚œλ…ν™” (Obfuscation)κ°€ 적용되면 뢄석이 맀우 μ–΄λ €μ›Œμ§„λ‹€.

- 정적 λΆ„μ„λ§ŒμœΌλ‘œλŠ” λ‹€μ–‘ν•œ 동적 μš”μ†Œλ₯Ό κ³ λ €ν•˜κΈ° μ–΄λ ΅λ‹€.

· 이 λ¬Έμ œλŠ” ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 흐름이 λ³΅μž‘ν• μˆ˜λ‘ λ”μš± 심각해짐

​

​

​

정적 λΆ„μ„μ˜ 예

λŒ€ν‘œμ μΈ 정적 뢄석 도ꡬ 쀑 ν•˜λ‚˜μΈ IDAλ₯Ό μ‚¬μš©ν•˜μ—¬ HelloWorld.exeλΌλŠ” ν”„λ‘œκ·Έλž¨μ„ μ—΄λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

 

μ΄λ―Έμ§€μ˜ κ°€μš΄λ° λΆ€λΆ„μ—μ„œ ν”„λ‘œκ·Έλž¨μ˜ μ–΄μ…ˆλΈ”λ¦¬ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³Ό 수 μžˆλ‹€.

μ΄λ―Έμ§€μ˜ μš°μΈ‘μ— μœ„μΉ˜ν•˜λŠ” μ½”λ“œλŠ” λ””μ»΄νŒŒμΌ(Decompile)된 μ½”λ“œμ΄λ‹€. 이듀은 기계어λ₯Ό μ‚¬λžŒμ΄ μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ μ–Έμ–΄λ‘œ λ‚˜νƒ€λ‚΄μ–΄ 뢄석을 λ”μš± μ‰½κ²Œ ν•  수 있게 ν•΄μ€€λ‹€.

​

μ΄λ―Έμ§€μ˜ μ’ŒμΈ‘μ—λŠ” ν”„λ‘œκ·Έλž¨μ„ κ΅¬μ„±ν•˜λŠ” μ—¬λŸ¬ ν•¨μˆ˜μ™€ ν”„λ‘œκ·Έλž¨κ³Ό κ΄€λ ¨λœ 각쒅 정보λ₯Ό λ³Ό 수 μžˆλ‹€.

이외에도

μƒν˜Έμ°Έμ‘° (Cross Reference) : λ¬Έμžμ—΄μ΄λ‚˜ ν•¨μˆ˜λ₯Ό μ–΄λ””μ—μ„œ μ‚¬μš©ν•˜λŠ” μ§€ λ³΄μ—¬μ€Œ

μ œμ–΄ 흐름 κ·Έλž˜ν”„ (Control Flow Graph) : ν•¨μˆ˜μ˜ μ‹€ν–‰ 흐름을 보기 μ‰½κ²Œ ν•΄μ€Œ

등을 톡해 뢄석가가 ν”„λ‘œκ·Έλž¨μ„ μ‰½κ²Œ 이해할 수 μžˆλ„λ‘ λ•λŠ”λ‹€.

​

​

μ œμ–΄ 흐름 κ·Έλž˜ν”„

 

​

​

​

​

​

2. 동적 뢄석 (Dynamic Analysis)

: ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€λ©΄μ„œ λΆ„μ„ν•˜λŠ” 방법

​

동석 λΆ„μ„μ˜ μž₯점 πŸ‘

- μ½”λ“œλ₯Ό μžμ„Ένžˆ 뢄석해보지 μ•Šκ³ λ„ ν”„λ‘œκ·Έλž¨μ˜ 개랡적인 λ™μž‘μ„ νŒŒμ•…ν•  수 μžˆλ‹€.

· μ–΄λ–€ μž…λ ₯에 λŒ€ν•œ κ°œλ³„ ν•¨μˆ˜ λ˜λŠ” ν”„λ‘œκ·Έλž¨μ˜ 좜λ ₯을 λΉ λ₯΄κ²Œ 확인할 수 μžˆμœΌλ―€λ‘œ 이 좜λ ₯값듀을 기반으둜 λ™μž‘μ„ μΆ”λ‘ ν•΄λ³Ό 수 μžˆλ‹€.

​

동적 λΆ„μ„μ˜ 단점 πŸ‘Ž

- 뢄석 ν™˜κ²½μ„ κ΅¬μΆ•ν•˜κΈ° μ–΄λ €μšΈ 수 μžˆλ‹€.

· 동적 뢄석은 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄μ„œ λΆ„μ„ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ, ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜μ§€ λͺ»ν•˜λ©΄ 동적 뢄석을 μ§„ν–‰ν•  수 μ—†λ‹€. → 가상 λ¨Έμ‹ μ΄λ‚˜ μž₯치λ₯Ό κ΅¬λ§€ν•˜λŠ” 것이 번거둭고 μ–΄λ €μšΈ 수 μžˆλ‹€.

- 동적 뢄석을 μ–΄λ ΅κ²Œ ν•˜λŠ” μ—¬λŸ¬ 기법이 개발됨

-> μ•ˆν‹° 디버깅 (Anti Debugging)

: 동적 λΆ„μ„μ˜ 일쒅인 디버깅을 방해함

μ•„λž˜μ™€ 같이 μžμ‹ μ΄ 디버깅 λ‹Ήν•˜κ³  μžˆλŠ”μ§€ κ²€μ‚¬ν•˜κ³ , 디버깅 쀑이면 ν”„λ‘œκ·Έλž¨μ„ κ°•μ œλ‘œ μ’…λ£Œμ‹œν‚΄

if (is_debugging()) // 디버깅인지 확인
  exit(-1); // ν”„λ‘œκ·Έλž¨ μ’…λ£Œ
Func();

​

​

​

동적 λΆ„μ„μ˜ 예

μœˆλ„μš°μ˜ λŒ€ν‘œμ μΈ 동적 뢄석 λ„κ΅¬λ‘œλŠ” 디버거 쀑 ν•˜λ‚˜μΈ x64dbgκ°€ μžˆλ‹€.

이λ₯Ό μ΄μš©ν•˜λ©΄ μ‹€ν–‰ 쀑인 μ–΄μ…ˆλΈ”λ¦¬ μ½”λ“œ, CPU의 λ ˆμ§€μŠ€ν„°(Register) μƒνƒœ, λ©”λͺ¨λ¦¬(Memory)와 μŠ€νƒ(Stack)의 값을 ν™•μΈν•˜λ©° 뢄석을 μ§„ν–‰ν•  수 μžˆλ‹€.

​

//helloworld.c
#include <stdio.h>
int main()
{
  int n = 0x31337;
  printf("Hello World 0x%x\n", n);
  return 0;
}

λ‹€μŒμ˜ μ½”λ“œλ₯Ό 컴파일 ν•œ HelloWorld.exeλ₯Ό x64dbg둜 동적 뢄석을 ν•˜λ©΄,

λ‹€μŒκ³Ό 같이 μ™Όμͺ½ μœ„κ°€ μ–΄μ…ˆλΈ”λ¦¬, μ™Όμͺ½ μ•„λž˜κ°€ λ©”λͺ¨λ¦¬, 였λ₯Έμͺ½ μœ„κ°€ λ ˆμ§€μŠ€ν„°, 였λ₯Έμͺ½ μ•„λž˜κ°€ μŠ€νƒμ˜ 정보λ₯Ό 보여쀀닀.

 

 

1)  ν˜„μž¬ μ½”λ“œλŠ” 0x31337μ΄λΌλŠ” μƒμˆ«κ°’μ„ μŠ€νƒμ— μ €μž₯ν•˜κ³  μžˆλ‹€. μ†ŒμŠ€ μ½”λ“œμ˜ int n = 0x31337에 λŒ€μ‘λœλ‹€.

2) 1의 μ½”λ“œλ₯Ό μ‹€ν–‰ν•œ 직후, 이미지 μ•„λž˜λ₯Ό 보면 μŠ€νƒμ— 0x31337이 μ €μž₯된 κ±Έ 확인할 수 μžˆλ‹€.

3) printf ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€. 이미지 였λ₯Έμͺ½ μœ„μ˜ λ ˆμ§€μŠ€ν„°λ₯Ό 보면, rcx에 Hello World 0x%x\n λ¬Έμžμ—΄μ΄, rdx에 0x31337이 μ €μž₯된 것을 확인할 수 μžˆλ‹€.

4) 3의 μ½”λ“œλ₯Ό μ‹€ν–‰ν•œ 직후, ν”„λ‘œκ·Έλž¨μ„ 보면 Hello World 0x31337이 좜λ ₯된 것을 확인할 수 μžˆλ‹€.

​

​

μœ„ μ˜ˆμ‹œμ²˜λŸΌ 동적 뢄석은 ν”„λ‘œκ·Έλž¨μ„ μ‹€μ œλ‘œ μ‹€ν–‰ν•˜λ©° μ‹œμŠ€ν…œμ˜ λ³€ν™”λ₯Ό κ΄€μ°°ν•˜λŠ” 것이 νŠΉμ§•μ΄λ‹€.

​

​

​

​

​

λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€!