본문 바로가기

리버싱

[리버싱] 디버거(OllyDbg)




디버그란


컴퓨터 프로그램의 정확성이나 논리적인 오류(버그)를 찾아내는 테스트 과정



디버거란


프로그램의 논리적인 오류(버그)를 찾아내기 위해 테스트하고 디버그하는 데 쓰이는 프로그램




OllyDbg



OllyDbg를 통해 Hello World 문자열을 출력하는 exe 파일을 실행시키면 다음과 같이 나온다.





우선 설정을 바꿔줬다.


디버거로 열었을 때 시작할 위치를 설정해준다.









Options -> Debugging options -> Events에서 Entry point of main module을 선택하면 된다.




그 다음 jump 하는 부분에 화살표를 만들어주는 설정을 해준다.




위의 ollydbg.ini 파일을 열어준다.





위와 같이 바꿔주면 다음과 같이 jump 부분에 화살표가 생긴다.






Code Window





위와 같이 왼쪽 상단에 위치한 영역을 뜻하며 어셈블리 코드가 보여진다.




메모리 주소이며 명령어가 실행될 주소를 나타낸다.





OP 코드(명령 코드)로 기계어의 일부다.





기계어를 어셈블리어로 바꿔놓은 디스어셈블리 창이다.





주소 부분에서 실행되고 있는 각 해당 위치의 offset 값과 변경된 메모리 주소, 레지스터의 내용 등을 보여주는 상태바이다.






Register Window




CPU 레지스터의 값을 실시간으로 표시해주는 창으로, 각 주소의 기계어나 어셈블리어에 따라 값이 바뀐다.


특정 레지스터들은 수정도 가능하다.








Dump Window






프로세스에서 필요한 메모리 주소 위치를 Hex(16진법)와 ASCII/UNICODE 로 표시하고 수정과 저장도 가능하다.


주소, HEX, ASCII 순서로 되어 있다.




Stack Window






ESP 레지스터가 가리키는 프로세스의 스택 메모리를 실시간으로 표시하고 수정도 가능하다.

스택 주소, 스택값, COMMENT 순서로 되어 있다.





단축키


F2

Set/Reset Breakpoint : 브레이크포인트 설정 / 해제


F3

Open new program : 열기


F4

Execute till Cursor : 커서 위치까지 실행 (디버깅하고 싶은 주소까지 바로 이동)


F5

Maximize / restore active window : 윈도우 최대화


F7

Step Into : 하나의 OP Code 실행 (CALL 명령을 만나면 그 함수 코드 내부로 들어감)


F8

Step Over : 하나의 OP Code 실행(CALL 명령을 만나면 따라 들어가지 않고 그냥 함수 자체를 실행함)


F9

Run : 실행 (Breakpoint 가 걸려있는 곳에서 실행 정지)


Ctrl + F2

Restart program : 다시 처음부터 디버깅 시작 (프로세스 종료 후 재실행)


Alt + F2

Close program : 프로그램 닫기


Ctrl + F9

Execute till return : 함수 내에서 RETN 명령어까지 실행 (함수 탈출 목적)


Ctrl + G

Go to : 원하는 주소를 찾아감 (코드를 확인할 때 사용, 커서만 이동하고 실행은 안됨)


Ctrl + E

Edit data : 데이터 편집


Alt + B

Open Breakpoints window : 브레이크포인트 창을 연다


Alt + C

Open CPU window : CPU 창을 연다


Alt + E

Open Modules window : 모듈 리스트를 연다


Alt + L

Open Log window : 로그창을 연다


Alt + M

Open Memory window : 메모리창을 연다


Space

Assemble : 어셈블리 코드 작성


Enter 

Preview CALL/JMP address : 커서가 CALL/JMP 등의 명령어에 위치하면 해당 주소를 따라가서 보여줌 (실행은 안되고 간단한 함수 내용 확인에 유용함)



: (콜론)

Label : 레이블(Label) 추가, 레이블이 추가되면 해당 주소에 대한 대명사가 생긴다


; (세미콜론)

Comment : 주석 (Comment) 추가


마우스 우클릭 

Search for -> User-defined comment : 사용자가 입력한 주석(Comment) 보기

Search for -> All referenced text strings : 코드에서 참조되는 문자열 보기 (현재 보이는 코드에 존재하는 모든 문자열 출력)

Search for -> All intermodular calls : 코드에서 호출되는 모든 API 함수 보기

Search for -> Name in all modules : 모든 API 함수 보기

Copy to executable file : 파일의 복사본 생성 (변경사항 반영)









우클릭 시 나오는 메뉴



Code Window 에서 우클릭 시 나오는 메뉴



Comment


어셈블리 코드 옆에 사용자가 주석을 달 수 있는 기능

단축키는 ; 이다.



Breakpoint 


실행 도중에 멈추고 사용자가 원하는 대로 프로그램을 수정하고 실행시킬 수 있는 기능



Search for


함수 이름을 대상으로 찾을 수도 있고 프로그램 내부에서 사용되는 문자열을 검색하는 기능

명령어를 입력해서 명령어가 위치한 지점을 찾을 때도 사용한다


- All intermodular calls : Import 된 함수들의 목록을 볼 수 있다

- All referenced text strings : 대상 프로그래에서 사용되는 문자열 값을 보여준다







Stack Window 에서 우클릭 시 나오는 메뉴



Lock stack 


스택 창은 ESP의 값에 따라 창이 변하는데 이를 막기 위해 사용하는 기능으로 표시되는 부분이 변화하는 것을 막을 수 있다



Go to EBP


현재 EBP 레지스터가 가리키고 있는 주소로 스택 창을 변경시켜 준다



Follow in Dump


특정 주소에 어떤 데이터가 들어있는지 확인하는 기능



Show ASCII dump, Show UNICODE dump


스택에 들어있는 데이터를 아스키값이나 유니코드 값으로 볼 수 있다





'리버싱' 카테고리의 다른 글

과제  (0) 2017.08.23
[리버싱] 리틀엔디안 빅엔디안  (0) 2017.08.22
[리버싱] 어셈블리어 명령어  (0) 2017.08.21
[리버싱] 어셈블리어란  (0) 2017.08.21
[리버싱] 리버싱에 대해 알아보자  (0) 2017.08.21