본문 바로가기

Tool

올리디버거(OllyDBG) 사용법

리버싱을 하기 위해서 이용되는 툴중에 디버거라는 것이 있다.
이 디버거들 중에 가장 대표적인 것은 올리디버거(OllyDebugger)이다.



odbg110.zip를 다운로드 받아서 odbg110 폴더에 압축을 풀고 Plugin폴더와 UDD폴더를 생성한다.
Win32_Programmers_Reference.rar로 압축을 풀어 wn32.hlp 파일을 obdg110 폴더에 넣는다. BOOKMARK.dll과 cmdline.dll은 Plugin폴더에 넣는다.

Ollydbg.exe를 실행하고  Option -> Appearance ->Directories를 열고 그림과 같이 경로 설정을 하고 다시 실행을 해준다.


이외에 설정해 주면 좋은 옵션은
작업관리자의 프로세스 목록에서 바로 디버깅 연결이 가능한 Jit(Just-in-time Debugging)
탐색기에서 파일 우클릭으로 바로 연결 가능한 Add explorer이 있다.


Help메뉴에서 Select API help file 선택을 해서 win32,hlp을 열어주면 자동으로 winapi도움말과 연결이 된다.


그리고 디버깅 옵션의 Event탭에서 프로그램을 열었을 때 시작할 위치를 Entry point of main module로 시작 지점을 잡아주도록 수정하는것이 좋다.


자 이제 마지막으로 점프위치를 화살표로 보기 좋게 표현하도록 고쳐보자.
ini파일을 메모장으로 열어서 [Settings]섹션을 다음과 같이 수정한다.

이렇게 바꿔주면 왼쪽처럼 화살표가 없던것이 오른쪽과 같이 화살표가 생긴다.

다른 옵션들은 자기에 맞게 변경하면 되고 그 옵션값들은 ollydbg.ini에 저장이 된다.
따라서 파일을 직접 수정해서 고치는것도 가능하다.

(참고로 TUTS4YOU 사이트에는 여러 형태의 리버싱 연습 문제들과 강좌도 많으므로
리버싱 공부를 위해 참고하면 좋다. : http://www.tuts4you.com/)



// ps. 추가로 한글판도 올립니다.



올리디버거로 notepad.exe를 열었을때의 화면이다.


1. 어셈블리코드
2. 레지스터 상태
3. Dump
4. 스택

3. Dump창에는 Heap이나 FileMap, Text 영역의 값들이 올 수 있다. 주소 부분을 16진수로 보여준다.

MENU :

[File] : 파일을 디버거로 불러오는 Open, 실행중인 프로세스를 디버거로 붙이는 Attach(해당 프로세스는 정지상태가 된다), 디버거를 종료하는 Exit가 있다.

[View] : 보여주는 기능. Memory를 선택하면 현재 Memory의 모습을 보여주고, Call Stack(Alt + K)을 선택하면 어디서 어떤 함수가 호출되었는지를 보여준다. 각 기능을 실행해보고 파악하자.

[Debug] :
Run : 디버거로 불러온 프로그램을 실행시킨다. Breakpoint를 만나거나 Exception이 발생해서 프로그램이 정지할때까지 실행한다. (단축키 : F9)
Restart : 프로그램을 처음부터 실행시키기 위해 재실행한다. Run을 해야 프로그램이 실행된다. (단축키 : Ctrl + F2)
Step into : 코드를 한줄씩 실행한다. Call(함수호출)나 Rep (반복문) 명령어를 만나면 함수내부로 들어가고 조건을 만족할때까지 계속 수행한다. (단축키 : F7)
Step over : 코드를 한줄씩 실행한다. Call(함수호출)나 Rep(반복문) 명령어를 만났을때 함수내부로 추적하지 않고 실행하며 반복문도 한번에 처리한후 다음줄로 넘어간다. (단축키 : F8)
Execute till return : 추적할 필요가 없는 함수 내부로 들어갔을때 그 함수의 ret명령 지점까지 한번에 실행하고 함수를 나올수 있다. (단축키 : Ctrl + F9)

[Plugin] : 올리디버거에서 사용하는 여러 플러그인 기능들이 있다. 다운받아 사용한다.

[Options] : 올리디버거의 설정 사항을 조정할수 있다.
Appearance에서는 Udd폴더나 Plugins폴더를 설정할 수 있고, 폰트도 변경할 수 있다.
Debugging options에서는 디버깅과 관련된 여러가지 설정을 변경할 수 있다.

[Windows] : 올리디버거 내부 윈도우들의 정렬 방식을 바꿀수 있으며, 원하는 윈도우를 활성화시킬 수도 있다.

1. 어셈블리코드 부분에서 우클릭시에 나오는 메뉴다.


Comment : 어셈블리코드 옆에 주석을 달아 놓을 수 있는 기능이다. 주석을 달아 놓음으로써 프로그램 분석을 보다 편리하게 할 수 있으므로 주석을 자주 달자.

Breakpoint : 디버거로 대상 프로그램을 실행시켰을 때 Breakpoint를 만나면 실행을 멈추고
사용자에게 제어를 넘겨준다.

Breakpoint에는 크게 두 가지가 있다.

 Software Breakpoint
CPU는 인터럽트를 이용하여 운영체제에게 특정 이벤트를 알려주며 CC(int3)라는 인터럽트가 발생되면 프로그램의 동작이 멈추게 되며 디버거에게 넘겨지게 되고 제어가 된다.
 Hardware Breakpoint
디버그 레지스터인 DR0, DR1, DR3, DR6, DR7을 이용하며 DR0~DR3은 Breakpoint를
걸어줄 대상의 주소 또는 범위를 설정할수 있으며 DR6은 인터럽트가 발생했을때의 결과를 알려주며 DR7은 Breakpoint의 속성을 설정할수 있다. 이것을 이용하면 특정 메모리 주소에 Write, Read, Excute가 발생했을 때 어떤 주소에서 실행이 되었는지 알수가 있다.

Search for :


All intermodular calls 기능은 Import된 함수들의 목록을 볼 수 있다.
All referenced text string 기능은 사용되는 문자열 값을 보여준다.

어셈블리코드가 있는 부분에서 더블클릭할 시에 직접 어셈블리 코드를 수정할 수 있다.
나머지 메뉴는 직접 실행해보며 파악하자.


2. 레지스터창에서 우클릭시 나오는 메뉴이다.


레지스터 상태창의 레지스터를 더블클릭하면 레지스터에 설정된 값을 변경할 수 있다.


3. Dump창에서 우클릭시 나오는 메뉴이다.



4. 스택창에서 우클릭시 나오는 메뉴이다.


Lock stack : 스택이 표시되는 윈도우가 ESP의 값에 따라서 변하는 것을 막아 표시되는 부분이 변하지 않도록 하여 스택의 특정 부분을 감시한다.
Go to EBP : 현재 EBP 레지스터가 가리키고 있는 주소로 스택 윈도우를 바꿔준다.
Follow in Dump : 스택에 들어있는 주소값에 어떤 데이터가 존재하는지 확인한다.

올리디버거의 화면을 세부적으로 설명하겠다.


1. 메모리 주소 : 프로그램을 디버깅하는 동안에 표시되는 주소지로 Ctrl + G 단축키로 특정
위치로 이동할 수 있다.

2. Opcode : 오퍼레이션 코드로 어떤 작동을 하는 코드들이 1byte로 정리되어 있다.
(1opcode == 1byte/2bytes == 1word/2words == 1dword)

3. Assembler Code : 디스어셈블된 코드들이다.

4. Olly가 분석한 내용 : api 함수들이나 문자열, 함수 파라미터들을 올리디버거가 보기 좋게 정리해서 보여준다.

5. 사용자가 입력한 주석 표시 : 세미클론(;)을 누르면 임시로 구분해 놓기 위한 내용들을 적을 수 있다.

6. 변수값 출력창 : 디버깅 중에 주요 변수들에 어떤 값들이 들어갔는지 표시해주는 창으로 자주 확인해야 한다.

7. Hex Dump창 : 16진수로 덤프를 하여 표시해주는 영역으로 바이너리 파일을 직접 수정할 때에 쓰인다.(hex값은 두 자리가 1byte이며, 1byte는 8bit가 된다)

8. 레지스터와 플래그 값 : CPU가 필요할 경우 사용하는 레지스터와 플래그의 값이 어떻게 변화하는지 보여준다. 레지스트리는 특별한 메모리 공간으로써 data를 저장하고 이용 가능하다.



다음은 OllyDBG 110의 단축키이다.

Pop-up menus display only items that apply. Frequently used menu functions:  

Function

Window

Menu command

Shortcut

Edit memory as binary, ASCII or UNICODE string

Disassembler, Stack Dump

Binary|Edit

Ctrl+E

Undo changes

Disassembler, Dump Registers

Undo selection Undo

Alt+BkSp

Run application

Main

Debug|Run

F9

Run to selection

Disassembler

Breakpoint|Run to selection

F4

Execute till return

Main

Debug|Execute till return

Ctrl+F9

Execute till user code

Main

Debug|Execute till user code

Alt+F9

Set/reset INT3 breakpoint

Disassembler Names, Source

Breakpoint|Toggle Toggle breakpoint

F2

Set/edit conditional INT3 breakpoint

Disassembler Names, Source

Breakpoint|Conditional Conditional breakpoint

Shift+F2

Set/edit conditional logging breakpoint (logs into the Log window)

Disassembler Names, Source

Breakpoint|Conditional log Conditional log breakpoint

Shift+F4

Temporarily disable/restore INT3 breakpoint

Breakpoints

Disable Enable

Space

Set memory breakpoint (only one is allowed)

Disassembler, Dump

Breakpoint|Memory, on access Breakpoint|Memory, on write

 

Remove memory breakpoint

Disassembler, Dump

Breakpoint|Remove memory breakpoint

 

Set hardware breakpoint (ME/NT/2000 only)

Disassembler, Dump

Breakpoint|Hardware (select type and size!)

 

Remove hardware breakpoint

Main

Debug|Hardware breakpoints

 

Set single-short break on access to memory block (NT/2000 only)

Memory

Set break-on-access

F2 

Set break on module, thread, debug string 

Options

Events

 

Set new origin

Disassembler

New origin here

 

Display list of all symbolic names

Disassembler, Dump Modules

Search for|Name (label) View names

Ctrl+N

Context-sensitive help (requires external help file!)

Disassembler, Names

Help on symbolic name

Ctrl+F1

Find all references in code to selected address range

Disassembler Dump

Find references to|Command Find references

Ctrl+R

Find all references in code to the constant

Disassembler

Find references to|Constant Search for|All constants

 

Search whole allocated memory

Memory 

Search Search next

Ctrl+L

Go to address or value of expression

Disassembler Dump

Go to|Expression Go to expression

Ctrl+G

Go to previous address/run trace item

Disassembler

Go to|Previous

Minus

Go to next address/run trace item

Disassembler

Go to|Next

Plus

Go to previous procedure

Disassembler

Go to|Previous procedure

Ctrl+Minus

Go to next procedure

Disassembler

Go to|Next procedure

Ctrl+Plus

View executable file

Disassembler, Dump, Modules

View|Executable file

 

Copy changes to executable file

Disassembler

Copy to executable file

 

Analyse executable code

Disassembler

Analysis|Analyse code

Ctrl+A

Scan object files and libraries

Disassembler

Scan object files

Ctrl+O

View resources

Modules, Memory

View all resources View resource strings

 

Suspend/resume thread

Threads

Suspend Resume

 

Display relative addresses

Disassembler, Dump, Stack

Doubleclick address

 

Copy

Most of windows

Copy to clipboard

Ctrl+C



Frequently used global shortcuts:
 

Ctrl+F2

Restart program

Alt+F2

Close program

F3

Open new program

F5

Maximize/restore active window

Alt+F5

Make OllyDbg topmost

F7

Step into (entering functions)

Ctrl+F7

Animate into (entering functions)

F8

Step over (executing function calls at once)

Ctrl+F8

Animate over (executing function calls at once)

F9

Run

Shift+F9

Pass exception to standard handler and run

Ctrl+F9

Execute till return

Alt+F9

Execute till user code

Ctrl+F11

Trace into

F12

Pause

Ctrl+F12

Trace over

Alt+B

Open Breakpoints window

Alt+C

Open CPU window

Alt+E

Open Modules window

Alt+L

Open Log window

Alt+M

Open Memory window

Alt+O

Open Options dialog

Ctrl+T

Set condition to pause Run trace

Alt+X

Close OllyDbg



Frequently used Disasembler shortcuts:
 

F2

Toggle breakpoint

Shift+F2

Set conditional breakpoint

F4

Run to selection

Alt+F7

Go to previous reference

Alt+F8

Go to next reference

Ctrl+A

Analyse code

Ctrl+B

Start binary search

Ctrl+C

Copy selection to clipboard

Ctrl+E

Edit selection in binary format

Ctrl+F

Search for a command

Ctrl+G

Follow expression

Ctrl+J

Show list of jumps to selected line

Ctrl+K

View call tree

Ctrl+L

Repeat last search

Ctrl+N

Open list of labels (names)

Ctrl+O

Scan object files

Ctrl+R

Find references to selected command

Ctrl+S

Search for a sequence of commands

Asterisk (*)

Origin

Enter

Follow jump or call

Plus (+)

Go to next location/next run trace item

Minus (-)

Go to previous location/previous run trace item

Space (  )

Assemble

Colon (:)

Add label

Semicolon (;)

Add comment



'Tool' 카테고리의 다른 글

디컴파일러(Decompliers)  (0) 2009.11.07
아이다(IDA)에 MS 심볼 서버 연동하기  (9) 2009.11.06
아이다(IDA)에 Hex-Ray 연동  (9) 2009.11.06
아이다(IDA) 사용법  (51) 2009.11.02
시스템 모니터링 툴  (0) 2009.11.01