KOROMOON

착한 사마리아인이 되고 싶습니다.

9/11/2020

OllyDbg


작성자 : KOROMOON

작성일 : 2013-11-28

※ OllyDbg 1.1 버전으로 기재함.




( 1 ) OllyDbg 란?


윈도우 디버거로 소스 코드는 공개되어 있지 않음.

무료로 사용할 수 있지만 영구히 사용하거나 영리를 목적으로 사용하기를 원하는 경우 사용자 등록을 해야 함. (사용자 등록 또한 무료임)

홈페이지 : http://www.ollydbg.de/




( 2 ) OllyDbg 첫 화면 구성



분류

설명

Code Window

Disassembly Code 표시

각종 Comment, Label 표시

Loop, Jump 위치 등의 정보 표시

State Window

OP Code 에 대한 상세한 정보 표시

Register Window

CPU Register 값 실시간 표시 (수정 가능)

Dump Window

Memory Hex, ASCII, Unicode 값으로 표시 (수정 가능)

Stack Window

ESP 가 가리키는 프로세스 Stack Memory 를 실시간 표시 (수정 가능)




( 3 ) Code Window 분류



분류

설명

Address

프로세스의 가상 메모리(VA : Virtual Address) 내의 주소

Instruction

IA32(또는 x86) CPU 명령어

Disassembled Code

OP Code 를 보기 쉽게 어셈블리로 변환한 코드

Comment

디버거에서 추가한 주석 (옵션에 따라 약간씩 다르게 보임)




( 4 ) OllyDbg Debug 주요 명령어


명령어

단축키

설명

Run

F9

실행

(Breakpoint 가 걸려있으면 그 곳에서 실행이 정지됨)

Pause

F12

정지

Restart

Ctrl+F2

재시작

Step into

F7

1줄짜리 OP Code 실행

(Call 함수 내부까지 들어감)

Setp over

F8

1줄짜리 OP Code 실행

(Call 함수 한번에 처리함)

Animate into

Ctrl+F7

OP Code 를 알아서 계속 실행

(Call 함수 내부까지 들어가고 Breakpoint 를 만나면 정지함)

Animate over

Ctrl+F8

OP Code 를 알아서 계속 실행

(Call 함수 한번에 처리하고 Breakpoint 를 만나면 정지함)

Execute till return

Ctrl+F9

함수 코드 내에서 RETN 명령어까지 실행

(함수 탈출 목적)

Execute till user

code

Alt+F9

Back to User 모드 실행

(, 프로세스가 정지되어 있는 상태이어야 함)




( 5 ) OllyDbg Code Window 주요 명령어


명령어

단축키

설명

Assemble

Space

현재 실행 중인 OP Code 확인

(수정 가능)

Label

:

라벨 추가

Comment

;

주석 추가

Breakpoint Toggle

F2

Breakpoint 설정/해제

Go to Expression

Ctrl+G

원하는 주소로 이동

(코드/메모리를 확인할 때 사용하며 실행되는 것은 아님)

Execute till Cursor

F4

커서 위치까지 실행

(디버깅하고 싶은 주소까지 바로 갈 수 있음)

Show the current EIP

*

현재 EIP 위치를 보여줌

(여기서 EIP 란 실행될 다음 명령어의 주소를 가리키는 레지스터를 말함)

Show the previous Cursor

-

직전 커서 위치를 다시 보여줌

Preview CALL/JMP Address

Enter

커서가 CALL/JMP 등의 명령어에 위치해 있다면 해당 주소를 따라가서 보여줌

(실행되는 것이 아니고 간단히 함수 내용을 확인할 때 유용함)

Name in all modules

 

모든 API 함수 보기

(마우스 우측 메뉴 Search for -> Name in all modules)

All intermodular calls

 

코드에서 호출되는 모든 API 함수 보기

(마우스 우측 메뉴 Search for -> All intermodular calls)

All referenced text strings

 

코드에서 참조되는 문자열 보기

(마우스 우측 메뉴 Search for -> All referenced text strings)

User-defined label

 

사용자가 입력한 라벨 목록 보기

(마우스 우측 메뉴 Search for -> User-defined label)

User-defined comment

 

사용자가 입력한 주석 목록 보기

(마우스 우측 메뉴 Search for -> User-defined comment)




( 6 ) 베이스캠프를 설치하는 방법


여기서 베이스캠프란 리버서들이 디버깅을 진행하면서 중간중간 코드에서 분석을 원하는 중요 포인트(주소)를 지정해 놓은 주소를 말함. 중요 포인트를 지정하는 방법에 대해서 알아보자!


① Go to Expression 기능

Go to Expression 기능(Ctrl+G)을 이용하여 베이스캠프 주소를 직접 입력함.


② Breakpoint Toggle 기능

Breakpoint Toggle 기능(F2)를 이용하여 베이스캠프 주소를 Breakpoint 로 설정한 후 실행(F9)함.

가장 편하고 많이 사용되는 방법임.

디버거는 현재 실행 위치에서부터 프로세스를 실행하다가 Breakpoint 가 걸린 곳에서 멈추게 되며 만약에 Breakpoint 가 없으면 그대로 계속 실행됨.


참고로 Breakpoint 는 여러 개 설정할 수 있으며 메인 메뉴 View -> Breakpoints 를 선택(Alt+B)하면 Breakpoint 목록을 확인할 수 있음.


③ Comment 기능

[;] 단축기로 주석(Comment)을 달고 이 주석을 찾아가는 방법임.

주석을 설정한 후 커서 위치를 잠시 다른 곳(40104F 이외의 위치)에 두고 마우스 우측 메뉴 Search for -> User-defined comment 항목을 선택하면 주석 목록창이 나옴.

빨간 글씨로 표시된 부분이 커서 위치로 주석 위치와 겹쳐지면 빨간 글씨만 나타냄.

해당 주석을 더블 클릭하면 그 주소로 갈 수 있음.


④ Label 기능

[:] 단축키로 라벨(Label)을 달고 이 라벨을 찾아가는 방법임.

라벨을 설정한 후 커서 위치를 잠시 다른 곳(40104F 이외의 위치)에 두고 마우스 우측 메뉴 Search for -> User-defined labels 항목을 선택하면 라벨 목록창이 나옴.

빨간 글씨로 표시된 부분이 커서 위치로 라벨 위치와 겹쳐지면 빨간 글씨만 나타냄.

해당 라벨을 더블 클릭하면 그 주소로 갈 수 있음.

참고로 라벨을 설정한 OP Code 가 Caller 로부터 호출당한 OP Code 라면 그 Call 한 OP Code 의 Disassembled Code 에 라벨이 찍힘.




( 7 ) 원하는 코드를 빨리 찾아내는 방법


넓은 코드 영역에서 분석을 원하는 코드를 빨리 찾아내야 함. 개발 도구의 Stub Code 가 삽입되어 있어 분석에 어려움이 있음.


① 문자열 검색 방법 (마우스 우측 메뉴 Search for -> All referenced text strings)

OllyDbg 가 디버깅할 프로그램을 처음 로딩할 때 사전 분석 과정을 거침.

프로세스 메모리를 전체 훑어서 참조되는 문자열과 호출되는 API 들을 뽑아내서 따로 목록으로 정리를 해놓음.

All referenced text strings 기능을 사용하면 프로그램 코드에서 참조되는 문자열들을 보여주며 분석을 원하는 코드 문자열들을 찾을 수 있음.

원하는 문자열을 더블 클릭하면 해당 주소로 갈 수 있음.


② API 검색 방법 (마우스 우측 메뉴 Search for -> All intermodular calls)

Windows 프로그래밍에서 모니터 화면에 뭔가를 출력하려면 Win32 API 를 사용하여 OS 에게 화면 출력을 요청해야 함. 즉 프로그램이 화면에 뭔가를 출력했다는 얘기는 프로그램 내부에서 Win32 API 를 사용한다는 뜻임.

그렇다면 프로그램의 기능을 보고 사용되었을 법한 Win32 API 호출을 예상하여 그 부분을 찾을 수 있다면 디버깅이 매우 간편해질 것임.

OllyDbg 의 사전 분석 기능 중에는 문자열 뿐만 아니라 사용되는 API 함수 목록을 뽑아내는 기능이 있음.

코드에서 사용된 API 호출 목록만 보고 싶을 때는 All intermodular calls 기능을 사용하여 프로그램에서 사용되는 API 함수 호출 목록을 나타냄.


③ API 검색 방법 (마우스 우측 메뉴 Search for -> Name in all modules)

OllyDbg 가 모든 실행 파일에 대해서 API 함수 호출 목록을 추출할 수 있는 것은 아님.

Packer / Protector 를 사용하여 실행 파일을 압축(또는 보호)해버리면 파일 구조가 변경되어 OllyDbg 에서 API 호출 목록이 보이지 않음.

이런 경우에는 프로세스 메모리에 로딩된 라이브러리(DLL 코드)에 직접 Breakpoint 를 걸어보는 것임.

API 라는 것은 OS 에서 제공한 함수이고 실제로 API 는 C:\Windows\system32 폴더에 *.dll 파일 내부에 구현되어 있음.

간단히 말해서 우리가 만든 프로그램이 어떤 의미 있는 일(각종 I/O)을 할려면 OS 에서 제공된 API 를 사용해서 OS 에게 요청해야 하고 그 API 가 실제 구현된 시스템 DLL 파일들은 우리 프로그램의 프로세스 메모리에 로딩되어야 함.

(위 그림에서 OllyDbg 의 Memory 창(Alt+M)으로 확인한 그림이며 아래 빨간색 박스는 USER32 라이브러리가 로딩되어 있는 메모리 영역임)

OllyDbg 의 또 다른 기본 해석 기능은 프로세스 실행을 위해서 같이 로딩된 시스템 DLL 파일이 제공하는 모든 API 목록을 보여주는 것임.

Name in all modules 기능을 사용하여 분석에 필요한 시스템 DLL 파일이 제공하는 API 를 추측하여 선택함.

더블 클릭하여 해당 주소를 이동한 후 Breakpoint(F2) 를 설정한 후 실행(F9)하여 보자.

(API 함수 코드 시작에 설치한 Breakpoint 에서 실행이 멈춤)

그리고 ESP 의 있는 API 함수의 리턴 주소를 확인하여 찾을 수 있음.


댓글 없음:

댓글 쓰기