해당 게시물은 드림핵의 강좌 내용을 정리한 것이다.
Ⅰ. 서론
리버스 엔지니어링에서 소프트웨어를 분석하기 위해 사용하는 방법
> 정적 분석(Static Analysis)
> 동적 분석(Dynamic Analysis)
리버스 엔지니어링에서는 상횡에 따라 어떤 방법을 택해 분석하는지에 따라 실력이 좌우됨
Ⅱ. 정적 분석
▶정적 분석(Static Analysis) : 프로그램을 실행시키지 않고 분석하는 방법
--- 장점 ---
(1) 전체 구조를 파악하기 쉬움
→ 함수의 구성, 어떤 API, 어떤 문자열이 사용됐는지 종합적으로 살펴볼 수 있음
(2) 분석 환경의 제약에서 비교적 자유로움
→ 윈도우 시스템에서 실행이 번거로운 파일들을 실행시키지 않아도 되어 분석을 시도할 수 있음
(3) 바이러스와 같은 악성 프로그램의 위협으로부터 안전함
→ 바이러스를 동적 분석할 경우, 실제로 실행해야 하므로 감염 우려의 문제가 있음
--- 단점 ---
(1) 난독화(Obfucation) 적용 시 분석이 매우 어려워짐
→ 최근에는 많은 개발자가 소프트웨어를 리버싱으로부터 보호하기 위해 난독화 기법을 적용함. 난독화가 적용되면 코드가 심하게 변형되어 이를 읽고 실행 흐름을 파악하기 어려워짐
(2) 다양한 동적 요소를 고려하기 어려움
→ 특점 시점에 어떤 함수가 정확히 어떤 인자와 어떤 전역 변수를 가지고 실행될지 파악하기 어려움 이는 프로그램의 실행 흐름의 복잡할수록 더욱 심각해짐
▶정적 분석의 예
대표적인 정적 분석 도구 중 하나인 IDA를 이용해 HelloWorld.exe라는 프로그램으로 열어보자.
가운데 부분 : 프로그램의 어셈블리 코드
우측 코드 : 디컴파일(Decompile)된 코드
좌측 부분 : 프로그램을 구성하는 여러 함수, 프로그램과 관련된 각종 정보
이 외의 IDA 기능
● 상호 참조(Cross Reference) : 문자열이나 함수를 어디에서 사용하는지를 보여주는 기능
● 제어 흐름 그래프(Control Flow Gragh) : 함수의 실행 흐름을 보기 쉽게 해주는 기능
Ⅲ. 동적 분석
▶ 동적 분석(Dynamic Analysis) : 프로그램을 실행시키면서 분석하는 방법
--- 장점 ---
(1) 코드를 자세히 분석해보지 않고도 프로그램의 개략적인 동작을 파악할 수 있음
→ 많은 함수로 구성된 프로그램을 정적 분석으로만 이해하기는 일반적으로 매우 어려움
(2) 어떤 입력에 대한 개별 함수 / 프로그램의 출력을 빠르게 확인할 수 있음
→ 복잡한 알고리즘을 정적 분석으로만 분석하는 것은 어려울 수 있지만 동적 분석은 다른 알고리즘과 비교하여 어떤 알고리즘인지 쉽게 판단할 수 있음
--- 단점 ---
(1) 분석 환경을 구축하기 어려울 수 있음
→ 프로그램을 실행하지 못하면 동적 분석을 진행할 수 없음
(2) 안티 디버깅(Anti Debugging) 시 동적 분석이 어려울 수 있음
→ 프로그램 자신이 디버깅 당하고 있는지 검사하고, 디버깅 중이면 프로그램을 강제로 종료시키는 방법이 있음
if (is_debugging()) //디버깅 중인지 확인
exit(-1) //프로그램을 종료
Func();
▶정적 분석의 예
윈도우의 대표적인 동적 분석 도구로는 디버거 중 하나인 x64dbg가 있음
디버거 : 프로그램의 버그를 찾아내고 제거하기 위해 사용되는 도구
디버거를 이용하면 실행 중인 어셈블리 코드, CPU의 레지스터(Register) 상태, 메모리(Memory)와 스택(Stack)의 값을 확인하며 분석을 진행할 수 있음
왼쪽 위 : 어셈블리
왼쪽 아래 : 메모리
오른쪽 위 : 레지스터
오른쪽 아래 : 스택의 정보
1. 현재 코드는 0x31337이라는 상수값을 스택에 저장하고 있음. 소스 코드의 int n = 0x31337에 대응됨
2. 1번의 코드를 실행한 직후, 이미지 오른쪽 아래를 보면 스택에 0x31337이 저장된 것을 확인 가능함
3. printf함수를 호출함. (call helloworld, 7FF63E6F11DB 부분)
이미지 오른쪽 위릐 레지스터를 보면, rcx에 Hello World 0x%x\n 문자열이, rdx에 0x31337이 저장되어 있음
소스 코드를 참조하면 printf 함수의 인자와 관련이 있다는 것을 알 수 있음
4. 3번의 코드를 실행한 직후, 프로그램을 보면 Hello World 0x3317이 출력된 것을 확인할 수 있음
이미지 출처 : Dreamhack | https://dreamhack.io/
'Reverse Engineering' 카테고리의 다른 글
스택 프레임(Stack Frame) (0) | 2022.08.28 |
---|---|
Dreamhack | Reverse Engineering | Stage 2 | Binary (0) | 2022.07.08 |