올리디버거(OllyDBG)란 무엇인가?
- 디버깅 프로그램 중 하나로, 디스어셈블리와 디버그가 모두 가능한 도구로 리버싱에서 사용된다.
- 디버거에 탑재된 Disassembler(디스어셈블러) 모듈이 기계어를 어셈블리어로 번역해서 보여준다.
- Debugger(디버거)는 다른 대상 프로그램을 테스트하고 디버그하는데 쓰이는 컴퓨터 프로그램이다.
- 디버그란? 컴퓨터 프로그램의 정확성이나 논리적인 오류(버그)를 찾아내는 과정
올리디버거 활용
올리디버거 아이콘을 더블클릭하여 실행해도 되지만, 분석할 파일을 마우스 우측 클릭 후 Open as OllyDbg를 클릭하여 실행도 가능하다.
분석할 파일을 올리디버거로 실행 후 화면을 보면 여러 코드들과 메모리 값들이 확인된다.
1. 주소 창: 명령어가 실행될 주소를 가르키는 창
2. OP 코드 창: 기계어를 보여주는 창
3. 디스어셈블리 창: 기계어를 어셈블리로 바꿔놓은 창
4. 레지스터 창: 레지스터의 값을 표시해주는 창 (각 주소의 기계어나 어셈블리에 따라 값이 바뀐다.)
5. 메모리 덤프 창: Address 주소, Hex dump, 각 Hex에 따른 ASCII 코드로 해석된 창을 보여준다.
6. 스택 창: 스택 주소, 스택 값, comment 순으로 표시된 창
Code Windows: 디스어셈블 코드를 보여주는 창 (1,2,3번)
Register Windows: 레지스터에 저장된 값을 실시간으로 보여주는 창, 수정 가능 (4번)
Dump Windows: 프로세스에서 원하는 메모리 주소 위치를 헥사값, 아스키/유니코드 값으로 보여줌. 수정 가능 (5번)
Stack Windows: ESP(스택 포인터)가 가르키는 스택 메모리를 실시간으로 보여줌. 수정 가능 (6번)
그림4의 빨간 박스를 보면 PUSH EBP로 확인된다.
올리디버거에서 해당 파일의 시작 함수에 맞춰 멈추게 된다.
main() (메인 함수)의 첫 부분은 아래 두 문장으로 시작된다.
PUSH EBP → 이전 EBP 레지스터의 값을 SFP 형태로 저장하고, ESP는 4바이트 아래로 이동한다.
MOV EBP ,ESP → 방금 움직인 ESP 레지스터 주소를 EBP로 설정함으로써 새로운 EBP가 생성된다.
이 과정을 함수 프롤로그라 한다.
SE handler installation - 메인 함수가 실행되기 전에 앞에 실행됨 → 에러 핸들러
→ 컴파일 할 때, exe 파일이 정상적으로 동작될수 있게 환경들을 흝어봄(오류 발생 시 메시지 박스 출력)
메인함수 찾을 때 run 으로 실행하여 바로 찾기
F9 → 다음으로 실행(Run), >와 동일
F7 → Step into, CALL(주소값 불러오기, 함수 불러오기)로 함수 안으로 들어감, 하나의 OP 코드 실행
F8 → 한칸씩 실행(Step over), 밖에서만 돌아감, Step into 와 같지만 CALL 만나도 따라 들어가지 않고 함수만 실행
F2 → Break Point 설정/해제, F9로 프로그램 실행 시 Break Point까지 실행된다.
ctrl + F2 → 다시 시작(Restart), 좌측 상단, <<와 동일
F9를 눌러 실행 시켜 본다.
그림5를 보면, F9를 눌러 실행 시킨 결과 Hi, Have a nice day!라는 문자열이 출력되는 것을 확인할 수 있다.
F9를 누르면 화면에 바로 뜨는 것이 아닌, 아래 창에 추가로 뜨는 것을 클릭하여 확인이 가능하다.
OK를 클릭하면 RETN으로 가게된다.
RETN(RET)는 CALL을 통해 호출된 함수에서 다시 복귀하기 위해 사용하는 명령이다.
분석하다가 놓친 경우 ctrl + F2를 눌러서 다시 시작한다.
ctrl + F2(Restart)를 눌러서 시작 위치로 다시 왔다.
좌측 상단에 Debug를 클릭하면 조작키 확인이 가능하다.
F8을 눌러서 step over를 통해 한칸씩 실행하다가, 의심되는 함수를 만나면 F7을 눌러 CALL로 해당 함수 안으로 들어간다.
함수 내부의 코드를 분석하여 해당 함수가 어떤 행위를 하는지 분석 할 수 있다.
F8을 눌러 MOV EBP, ESP로 이동한다.
우측의 EIP를 보면 다음에 이동할 주소창이 확인되며(00401033), F8을 한번 더 누르면 EBP와 ESP가 동일한 값으로 변하게 된다. MOV EBP, ESP → ESP 값을 EBP에 대입한다는 의미.
특정 함수를 실행하기 전에(어떤 변수를 넣기 전에) 초기화하는 단계로 볼 수 있다.
앞의 코드는 SE handler installation을 세팅하기위한 일종의 작업으로 자세하게 분석할 필요가 없다.
F8을 눌러서 한칸씩 실행한다.
앞의 코드는 SE handler의 세팅을 하는 코드로, 에러가 발생했을때 제어할 수 있도록 세팅하는 구간으로 볼 수 있다.
SE handler - 에러가 발생했을때 제어할 수 있도록 세팅함.
아래 코드는 레지스터를 사용하기 위한 작업이다. 세팅을 해야 연산을 하고 수행을 할 수 있다.
PUSH EBX
PUSH ESI
PUSH EDI
F8을 눌러 계속 한칸씩 실행하고, CALL에 도착했을 때 F7를 눌러 함수 안으로 들어간다.(Step into)
F7를 눌러 함수(GetVersion)로 진입하게 되면 새로운 코드들이 확인된다.
CALL 함수 (GetVersion) 내부에서 F8을 눌러 한칸씩 실행시킨다.
RETN(RET) 명령이 나올 때 까지 실행시킨다.
RETN 이 확인되면 CALL을 통해 호출된 함수에서 다시 복귀. → GetVersion 의 기능을 하는 함수의 종료
F8을 눌러 RETN에서 함수 밖으로 나간다.
F8을 눌러 RETN에서 함수 밖으로 나오게 되면, CALL에서 F7을 입력해서 진입했던 GetVersion 함수(윈도우 버전 확인 작업) 다음 코드로 이동하게 된다.
F8을 눌러 한칸씩 실행하다 보면 CALL 함수가 여러 개 있는 것을 확인할 수 있다.
Sample_0.00401000 이 확인되는데, 이는 이 프로그램의 베이스코드로 실제 메인함수에서 사용한다.
이전까지의 코드는 stub code 라고 한다.
stub code는 실행 정보를 가져오고 Image Base Address 값을 구하는 등, 프로그램 실행에 필요한 정보를 얻어오는 코드로 구성되어 있다.
stub code는 스킵하고 메인 함수 코드를 찾아서 분석하는것이 중요하다.
F8을 눌러서 한칸씩 실행 시켜 메인 함수 Sample_0.00401000에 도달한다.
또는 F9를 눌러서 한번에 메인 함수에 도달할 수 있다.
F2를 눌러 break를 걸어준다.
분석하다가 여러 번 분석하기 위해 break를 걸어 현재 EIP에서 break point가 걸린 곳까지만 실행하도록 설정한다.
Sample_0.00401000 에서 F7을 눌러 함수로 들어간다.
그림17의 빨간 박스 영역이 메인 함수 영역으로 Message Box를 띄우고 Beep 음을 발생시키는 간단한 코드로 확인된다.
그림18을 보면 아래 두 개의 함수가 확인된다.
KERNEL32.Beep → 스피커에서 간단한 톤을 생성
USER32.MessageBoxA → 시스템 아이콘, 단추 집합 및 상태 또는 오류 정보와 같은 간단한 애플리케이션 관련 메시지가 포함된 모달 대화 상자를 표시한다. 메시지 상자는 사용자가 클릭한 단추를 나타내는 정수 값을 반환한다.
F8로 한칸씩 실행시켜 KERNEL32.Beep 에 도달하게 되면, Beep 음을 발생시킨다.
Hex dump 부분을 클릭하여 ctrl + G를 입력하여 Dump 에서 주소값을 검색하여 텍스트를 찾을 수 있다.
F8로 한칸씩 실행시켜 MessageBox를 띄우게되면 해당 함수가 종료된다.
F8를 누르면 화면에 바로 뜨는 것이 아닌, 아래 창에 추가로 뜨는 것을 클릭하여 확인이 가능하다.
결론
- 디버깅 프로그램 중 하나로, 디스어셈블리와 디버그가 모두 가능한 도구로 리버싱에서 사용된다.
- 메인 함수를 찾아서 함수 내부로 들어가 한칸씩 실행해 보며 프로그램의 행위를 분석한다.
- 여러 번 분석이 필요한 경우가 있으므로 F2(Break Point)를 적절하게 활용하여 분석한다.
'보안 > 악성코드 분석' 카테고리의 다른 글
리버싱 개념 및 어셈블리어 설명 (0) | 2024.07.27 |
---|---|
악성코드 동적 분석 도구 기능 및 사용법 (Process Monitor, Process Explorer) (0) | 2024.07.26 |
DLL 의존성 확인 도구 (Dependency Walker) & 리소스 확인 도구 (리소스 해커) 기능 및 사용법 (0) | 2024.07.24 |
PE 헤더 분석 도구 (PEview, pestudio) 기능 및 사용법 (4) | 2024.07.23 |
악성코드 분석 시 파일 내 문자열 확인 도구 (BinText, Strings) 기능 및 사용법 (3) | 2024.07.22 |