reversing

static vs. dynamic analysis

hauni 2024. 10. 13. 02:45

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

 

장점

- 프로그램의 전체 구조를 파악하기 쉬움. 프로그램이 어떤 함수로 구성됐고 함수들은 서로 어떤 호출 관계를 갖는지, 어떤 API를 사용하고 어떤 문자열을 포함하는지 등을 종합적으로 살펴볼 수 있음.

- 분석 제약에서도 비교적 자유로움.

- 바이러스와 같은 악성 프로그램으로부터 안전함. 바이러스를 동적 분석할 경우, 바이러스를 실제로 실행해야 하므로 자신의 컴퓨터가 감염될 우려가 있음.

 

단점

- 프로그램이 난독화되면 분석이 어려워짐. 난독화가 적용되면 프로그램의 코드가 심하게 변형돼서 이를 읽고, 실행 흐름을 파악하기가 어려워짐.

- 다양한 동적 요소를 고려하기 어려움. 어떤 함수가 특정 시점에 정확히 어떤 인자와 어떤 전역 변수를 가지고 실행될지는 정적으로 알기 어려움


IDA

정적 분석 도구 중 하나

 

가운데: 어셈블리 코드

우측: 디컴파일된 코드. 기계어를 사람이 이해하기 쉬운 언어로 나타냄

좌측: 프로그램을 구성하는 여러 함수와 프로그램과 관련된 각종 정보

 

 

함수의 실행 흐름을 보기 쉽게 해주는 제어 흐름 그래프


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

 

장점

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

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

 

단점

- 분석환경을 구축하기 어려울 수 있음

- 디버깅을 방해하는 안티 디버깅 때문에 분석이 어려울 수 있음.

ex) 아래의 코드처럼 자신이 디버깅 당하고 있는지 검사하고, 디버깅 중이면 프로그램을 강제로 종료시키는 방법이 있음

 

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

x64dbg

동적 분석 도구 중 하나

디버거는 프로그램의 버그를 찾아내고 제거하기 위해 사용되는 도구인데, 이를 이용하면 실행 중인 어셈블리 코드, CPU의 레지스터 상태, 메모리와 스택의 값을 확인하며 분석을 진행할 수 있음

 

ex) HelloWorld.exe를 x64dbg로 동적 분석하기

//helloworld.c

#include <stdio.h>

int main()
{
  int n = 0x31337;
  printf("Hello World 0x%x\n", n);
  return 0;
}

 

x64dbg의 각 패널
int n = 0x31337에 대응되는 명령어

 

현재 코드는 0x31337이라는 상수값을 스택에 저장하고 있음

 

명령어 실행 이후 스택에 0x31337이 저장된 모습

 

1의 코드를 실행한 직후 이미지 오른쪽 아래를 보면 스택에 0x31337이 저장된 것을 확인할 수 있음

 

printf() 호출 직전 인자가 세팅된 모습

 

printf 함수 호출

이미지 오른쪽 위 레지스터를 보면 RCX에 Hello World 0x%x\n 문자열이, RDX에는 0x31337이 저장된 것을 확인할 수 있음

소스코드를 참조하면, printf 함수의 인자와 관련 있다는 것을 알 수 있음

 

 

printf 호출 결과