정적 분석: 프로그램을 실행시키지 않고 분석하는 방법
장점
- 프로그램의 전체 구조를 파악하기 쉬움. 프로그램이 어떤 함수로 구성됐고 함수들은 서로 어떤 호출 관계를 갖는지, 어떤 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;
}
현재 코드는 0x31337이라는 상수값을 스택에 저장하고 있음
1의 코드를 실행한 직후 이미지 오른쪽 아래를 보면 스택에 0x31337이 저장된 것을 확인할 수 있음
printf 함수 호출
이미지 오른쪽 위 레지스터를 보면 RCX에 Hello World 0x%x\n 문자열이, RDX에는 0x31337이 저장된 것을 확인할 수 있음
소스코드를 참조하면, printf 함수의 인자와 관련 있다는 것을 알 수 있음
printf 호출 결과
'reversing' 카테고리의 다른 글
레지스터, 프로세스 메모리 구조, 섹션, 스택, 힙 (0) | 2024.10.27 |
---|---|
악성코드 종류와 분석 (1) | 2024.10.19 |
Binary (0) | 2024.10.13 |
범용 레지스터, 플래그 레지스터, 스택 프레임 (0) | 2024.09.28 |
리버싱 개념, 크랙과 패치, 바이트 오더링 (0) | 2024.09.28 |