Information Security Study

Static Analysis vs. Dynamic Analysis 본문

Dreamhack/Reversing

Static Analysis vs. Dynamic Analysis

gayeon_ 2023. 11. 23. 16:23

정적 분석 Static Analysis

: 프로그램을 실행시키지 않고 분석하는 방법

 

장점

- 프로그램의 전체구조를 파악하기 쉽다

- 프로그램의 구성, 함수 호출 관계, 사용 API, 포함하는 문자열 등을 종합적으로 살펴볼 수 있다

- 이 정보들로 프로그램을 큰 관점에서 이해할 수 있다

- 분석 환경의 제약에서 비교적 자유롭다

- 바이러스와 같은 악성 프로그램의 위협으로부터 안전하다

 

단점

- 프로그램에 난독화가 적용되면 분석이 어렵다

- 다양한 동적 요소를 고려하기 어렵다

 

정적 분석으로 동적 요소를 고려하기 어려운 이유

: 프로그램은 실행 중에 영향을 주고 받는 여러 함수로 구성된다. A함수가 B함수에 들어가는 인자를 결정할 수 있고, A와 B가 서로 같은 전역변수를 공유할 수 있다. 따라서 어떤 함수가 특정 시점에 정확히 어떤 인자와 어떤 전역 변수를 가지고 실행될지는 정적 분석으로 알기 어렵다.

 

정적 분석의 예

 

정적 분석 도구로 HelloWorld.exe 프로그램을 연 모습

 

이미지 가운데 부분에는 프로그램의 어셈블리 코드가 있다. 우측에는 디컴파일된 코드이다. 디컴파일 코드는 기계어를 사람이 이해하기 쉬운 언어로 나타낸 것이다.

좌측에는 프로그램을 구성하는 여러 함수와 프로그램과 관련된 정보를 볼 수 있다.

 

문자열이나 함수를 어디에서 사용하는지 보여주는 상호참조 기능이나 함수의 실행 흐름을 보기 쉽게 해주는 제어 흐름 그래프 등을 통해 프로그램을 쉽게 이해할 수 있도록 돕는다.

 

 

 

 

동적 분석 Dynamic Analysis

: 프로그램을 실행시키면서 분석하는 방법

 

장점

- 코드를 자세히 분석해보지 않고도 프로그램의 개략적인 동작을 파악할 수 있다

- 어떤 입력에 대한 개별 함수 또는 프로그램의 출력을 빠르게 확인할 수 있어 출력값들을 기반으로 동작을 추론할 수 있다

 

단점

- 분석 환경을 구축하기 어렵다

 

안티 디버깅 Anti Debugging

: 동적 분석의 일종인 디버깅을 방해하는 것

 

if (is_debugging()) // 디버깅인지 확인
  exit(-1); // 프로그램 종료
Func();

 

안티 디버깅의 예

 

동적 분석의 예

윈도우의 대표적인 동적 분석 도구: x64dbg

 

디버거

: 프로그램의 버그를 찾아내고 제거하기 위해 사용되는 도구

: 이를 이용해 실행 중인 어셈블리 코드, CPU의 레지스터 상태, 메모리와 스택 값을 확인하며 분석할 수 있다.

 

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

위 코드를 컴파일할 HelloWorld.exe를 x64dbg로 동적 분석하는 예

 

 

 

 

코드에서 0x31337이라는 상숫값을 스택에 저장하고 있다.

 

 

 

코드를 실행한 직후 0x31337가 스택에 저장된 것을 볼 수 있다.

 

 

 

printf 함수를 호출한다. 레지스터를 보면 rcx에 Hello World0x%x\n 문자열, rdx에 0x31337이 저장된 것을 볼 수 있다.

소스 코드를 참조하면 printf 함수의 인자랑 관련이 있다는 것을 알 수 있다.

 

 

 

 

이전 이미지의 코드를 실행한 직후에 프로그램을 보면 문자열과 상숫값이 출력된 것을 확인할 수 있다.

 

 

 

 

이 예시를 통해 알 수 있는 동적 분석의 특징

- 프로그램을 실제로 실행하며 시스템의 변화를 관찰한다

- 함수 실행 시 어떤 인자가 함수로 전달되며 그 때의 메모리 상태는 어떠한지 등을 직관적으로 확인할 수 있다

 

 

 

'Dreamhack > Reversing' 카테고리의 다른 글

Computer Architecture  (0) 2023.11.23
Binary  (0) 2023.09.24
Introduction: Reverse Engineering  (0) 2023.09.24
Reversing Basic Challenge #2  (0) 2023.08.16
Reversing Basic Challenge #1  (0) 2023.08.16