리버싱을 하기 위해서 이용되는 툴중에 디버거라는 것이 있다.
이 디버거들 중에 가장 대표적인 것은 올리디버거(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 |