Helloworld.exe  올리디버그로 어셈코드를 분석!

HUJ

응응귀엽당..ㅎ



Helloworld.c를 컴파일해서 올리디버그로 각각 어셈코드를 분석해보겠습니다~


이쁜 Visual Studio 열어서 Hello world! 가 출력되게 다음과 같이 작성해줍니다.

#include <stdio.h>

int main()

{

printf("Hello world!\n");

return 0;

}


F5를 눌려서 디버깅을 해줍니다.

만약, Ctrl+F5를 눌려서 디버깅않고 시작해주면 다음 그림처럼 뜨게 되겠쥬


그럼 빠져나와서 Helloworld 프로젝트 저장한곳을 찾아줍니다. 그다음 Debug파일에 들어가셔서 다음그림처럼 Helloworld.exe를 찾으면 됩니다. 

찾기어려우시면 

[시작 - 검색창에 Helloworld.exe (자신이 만든 프로젝트이름)] 치고 오른쪽 클릭하셔서 파일위치열기 누르시면 나옵니다.~


다음 올리디버그를 열어주시고, 저 파일을 찾아 open 해줍니다.

그럼 다음과 같이 뜨게될껍니다.

(이제 그림밑에 설명써야징)


64bit컴퓨터에 버전 110을 사용하시면 저 하얀창 뒤엔 요렇게..ㅜ

그래서 전 다시 220을 깔고 다시 환경설정했습니다.ㅜㅜ


이제 안나타나고 잘실행되네요>< 본격적으로 분석해보겠습니다.


일단 처음해보는 분석이니, F7을 누르면서 하나하나 살펴보고, int main에 해당하는 부분을 찾아봅니다.


이것저것 보는중..ㅋㅋㅋ


일단 윗 그림처럼 찾기 쉬운, ASCII 코드로 되어있을 "Hello world!" 라고 출력될 코드를 찾아봅시다. 컨트롤 에프 눌려서 찾고싶다만.. 안됨...ㅠㅠ


제가 찾아본 방법은 이렇습니다.

CPU 창에서 오른쪽 클릭! 문자열string 일테니, [Search for - All referenced Strings] 으로 들어가 봅시당


창이 뜸과 동시에, ASCII 코드로 표시된 "Hello world!" 발견!!! 저 빨간상자를 눌려주시면 해당 주소로 알아서 찾아가줍니다ㅎㅎㅎ


ㅎㅎㅎㅎ발견ㅎㅎㅎ

거기서 F2로 BreakPoint설정하고 F7을 누르니, 스택 창보시면 comment에도 가리키는걸 보실수있습니다.


이제 return 0;의 어셈코드를 보고싶었는데,, 스택창 comment에서 return 같은게 있네요

이건 더 배우고 와야될듯ㅜ


엉엉ㅃㅃ

Posted by 알 수 없는 사용자
,


 올리디버거  (Ollydbg) 설치 및 사용법 생각중 HUJ


<사용 환경버전>

64bit 컴퓨터


<올리디버거 란?>

디버깅 프로그램중 하나이며, 디스어셈블리와 디버그가 모두 가능한 툴이라 리버싱에 기본적으로 사용됩니다.

지금 사용할 버전 110은 32bit 컴퓨터에 안정되어있습니다~


<다운로드 & 설치>

http://www.ollydbg.de/ 에서 64bit 컴퓨터는 201버전을 다운받아도 되지만, 

플러그인을 따로 설치 해야되므로, 첨부된 파일을 저장하여 풀어 사용하는것이 좋습니다.

(기본설정되어있음.)

odbg110.zip

각종 플러그인 다운로드 사이트 : TUTS4YOU (http://www.tuts4you.com)


<환경설정, 기본설정>

-->저 파일을 다운받았을시, 이 부분은 무시하셔도 좋지만, 설정안된 부분이 있을 수 있으니 확인바랍니다.


-UDD

-Plugin 파일이 생성되어있습니다. (없다면 파일을 생성해주세요)


UDD 파일에는 브레이크 포인트 지점, 백업파일 등 디버깅 설정 저장 공간

Plugin 파일에는 각종 플러그인 파일들 저장

쉽게말해, 정리해서 보기좋고 경로를 쉽게 설정하기 위한 기본설정인 것입니다.


혹시 win32.hlp 파일이 없다면, http://www.tuts4you.com/download.php?view.258

에서 다운로드 하시면 됩니다.

(없어도 무방하지만, 나중에 API 찾을때 유용합니다.)


Plugin 파일에 각종 .dll 파일을 옮겨줍니다.


이제 OLLYDBG 을 실행해봅시다.

64bit 컴퓨터로 실행할경우, 노란주의 표시가 뜨는데, 그냥 확인을 누르셔도 되고,

실행할때 권리자 권한으로 실행해주셔도 됩니다.


아까, UDD와 Plugin 파일을 생성했으니 프로그램에 설정을 해줘야됩니다.

[Options - Appearance - Directories] 으로 들어가서 UDD와 Plugin path 경로를 아까 UDD와 Plugin 파일로 경로를 바꿔주시면 됩니다.


다음, 디버거로 열었을 때 시작할 위치를 설정해줍니다.

 [Alt+O] or [Options - Debugging options - Events] 에서 [Entry point of main module] 을 체크해주시면 됩니다.


그다음, jump 하는부분에 화살표를 만들어주는 설정을 해줍니다. 저기 ollydbg 구성설정 파일을 열어줍니다.


밑 사진 처럼, 저곳에 다음을 입력해줍니다. 복붙 복붙ㅋㅋ

Show jump direction=1

Show jump path=1

Show jumpfrom path=1

Show path if jump is not taken=1


다음과 같이 jump부분에서 화살표가 생긴것을 보실 수 있습니다.


여기까지 환경설정은 끝났고,,


<사용방법>

[File - Open] 이나 F3, 아니면 open할 파일을 드래그해서 열어봅니다.

1. 주소 창 : 명령어가 실행될 주소를 가르키는 창

2. OP코드 창 : 기계어를 보여주는 창

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

4. 레지스터 창 : 레지스터의 값을 표시해주는 창 

(각 주소의 기계어나 어셈블리에 따라 값이 바뀐다.)

5. 메모리 덤프 창 : Address 주소, Hex dump, 각 Hex에 따른 ASCII코드로 해석된 창을 보여줌

6. 스택 창 : 스택 주소, 스택 값, comment 순으로 표시된 창


<기본 어셈블리어 간단한 설명>

PUSH : 스택에 값을 넣는 명령어.

POP : 스택에 값을 빼는 명령어.

INC (increase), DEC(decrease) : 증가, 감소 명령어.

ADD, SUB, MUL, DIY : 사칙연산 명령어.

OR, AND, XOR : 논리연산 명령어.    

예) XOR EAX : 값을 0으로 초기화 시키는 명령어.

CMP, TEST : CMP는 빼서 비교한다 (값이 변경됨) TEST는 값을 변경하지 않고 비교함.  (둘다 값이 같을때 ZF는 1, 다를경우 0)

CALL : 함수 호출 명령어.

RETN : 함수 리턴 명령어. 모두 반환되는 것이 아니라, LEAYE 명령어로 함수에 사용된 스택 값을 보내준다.

JMP 는  http://www.unixwiz.net/techtips/x86-jumps.html/ 참조.


<단축키>

Run (F9) : 프로그램을 실행.

Break Pint (F2) : Break Point 설정/해제  (Run (F9)으로 프로그램을 실행할때 이 break point까지 실행된다.)

Step into (F7) : 한줄씩 실행되면서, CALL에서 프로그램 내부 함수 로 들어가게 됨.

Step over (F8) : 한줄씩 실행되면서, CALL에서 코드 함수로 들어가지않고 진행됨.

Execute till return (Ctrl+F9) : RETN 명령어가 나올때까지 실행함.

그 외의 단축키 : http://www.ollydbg.de/quickst.htm 참조


바이포스팅 끝><

Posted by 알 수 없는 사용자
,