Level

초급



Content

"Hello World!" 프로그램을 디버깅 해보고 간단한 패치를 해보도록 하겠습니다.
이를 통하여 디버깅에 대한 감을 잡으실 수 있습니다.



Goal

- 기본적인 디버거 사용방법의 이해
- 간단한 Disassembly code 이해
- 간단한 프로그램 패치(patch)



Tool

Visual C++ 2008 Express Edition
OllyDbg 1.10



Hello World!

모든 C 프로그래머가 최초로 만들어 본 프로그램 Hello World! 를 최초의 디버깅 프로그램으로 결정하였습니다. SW 업계에서의 차지하는 Hello World! 의 의미, 처음 C 를 배울때의 두근거림 그리고 소스 코드의 간결함까지... 이 모든 것이 최초의 디버깅 프로그램으로써 더 할 나위 없이 딱 들어맞는군요.

자신에게 익숙한 C/C++ 개발툴을 이용하여 Hello World! 를 만들어 봅니다.
(Release 모드로 빌드하면 코드가 좀 더 간결해져서 디버깅하기 편합니다.)


<Fig. 1>




디버깅 목표


위에서 만든 HelloWorld.exe 를 실행해보면 당.연.히. "Hello World!" 메시지 박스가 출력될 것입니다. 그냥 디버깅만 하면 재미없으니까 이 문자열을 "Hello Reversing!" 으로 바꾸는걸 목표로 하겠습니다.

그러기 위해서는 먼저 HelloWorld.exe 를 디버깅하여 main() 함수내의 MessageBox() 함수 호출 코드를 찾아야 합니다.

그리고 적절히 해당 문자열 위치를 알아내어 변경시키면 되겠지요.



디버깅 시작

첨부된 HelloWorld.exe 파일을 OllyDbg.exe 로 열어보겠습니다.

* VC++ 도  소스가 있을때 어셈블리 수준의 디버깅이 가능합니다만, 일반적으로는 분석할때 소스가 없으므로 OllyDbg 같은 Win32 전문 디버거를 사용하게 됩니다.


<Fig. 2>


디버깅을 시작하기 전에 간단히
<Fig. 2> 에 보이는 OllyDbg 의 메인 화면 구성에 대해 설명드리겠습니다.

- code :
기본적으로 disassembly code 를 표시하고 각종 comment, label 을 보여주며 코드를 분석하여 loop, jump 위치 등의 정보를 표시한다.
- register : CPU register 값을 실시간으로 표시하며 특정 register 들은 수정도 가능함.
- dump : 프로세스내의 원하는 memory 주소 위치를 hex ASCII 값으로 표시하고 수정도 가능함.
- stack : ESP register 가 가리키는 프로세스 stack memory 를 실시간으로 표시하고 수정도 가능함.

디버거가 멈춘 곳은
EntryPoint(EP) 코드로써 HelloWorld.exe 의 실행 시작 위치(4011A1)입니다. 일단 EP 코드에서 눈에 띄는건 CALL 명령과 그 밑의 JMP 명령입니다.

Address     OP code        Disassembly       comment
----------------------------------------------------------------------------
004011A1    EB A6160000    CALL 0040284C     ; 0040284C (40284C 주소의 함수를 호출
)
004011A6    E9 A4FEFFFF    JMP 0040104F      ; 0040104F (40104F 주소로 점프)

- Address : 프로세스의 가상메모리(Virtual Address:VA) 내의 주소 위치
- OP code : OPeration code 의 줄임말로써 IA32(또는 x86) CPU 명령어
- Disassembly : OP code 를 보기쉽게 디스어셈 해준 코드
- comment : 디버거에서 추가한 주석 (옵션에 따라 약간씩 다르게 보임)

디스어셈 코드를 처음 보신 분들이라도 위 두줄의 코드는 그 의미가 명확합니다.

"40284C 주소의 함수를 호출(CALL)한 후 40104F 주소로 점프(JMP) 하라"

계속 디버깅을 진행해 보겠습니다.
목표는 우리가 작성한 main() 함수내의 MessageBox() 함수 호출을 확인하는 것입니다.



40284C
함수 따라가기

- Step Into [F7] :
하나의 OP code 실행 (CALL 명령을 만나면, 그 함수 코드 내부로 따라 들어감.)
- Step Over [F8] : 하나의 OP code 실행 (CALL 명령을 만나면, 따라 들어가지 않고 그냥 함수자체를 실행함.)
- Execute till Return [Ctrl+F9] :
함수 코드 내에서 RETN 명령어 까지 실행 (함수 탈출 목적)

F7
단축키로 함수 안으로 따라갈 수 있습니다.


<Fig. 3>


위 코드를 얼핏 보아도
Hello World! 에서는 사용된 적 없는 API 들이 호출되고 있습니다.
이곳은 분명 우리가 찾는 main() 함수가 아니겠군요.
이곳은 VC++ 에서 프로그램 실행을 위해서 추가시킨 (우리 소스코드에는 없지만) VC++ stub code 입니다. (각 컴파일러 종류/버전별로 stub code 는 틀려집니다.)
지금은 신경쓰지 말고 우리의 목표 main() 을 찾아 계속 진행해 보겠습니다.

*
주의사항 : 처음에는 Win32 API 함수들(OllyDbg comment 상에서 빨간색 API 함수 호출 부분)은 따라가지 마세요.  너무 헤멜 수 있습니다. Step over[F8] 로 넘어가세요.

4028E1
주소에 RETN 명령어가 있습니다.
(RETN
은 함수의 끝을 나타내며 함수가 호출된 명령어 바로 다음 명령어로 되돌아 갑니다.)

그곳까지 Step over [F8] 하시거나 또는 Execute till Return [Ctrl+F9]로 한방에 가봅니다.

그리고
RETN 명령어를 실행하면[F7/F8] <Fig. 2> 에서 봤던 4011A6 주소로 오게됩니다.
(C
언어에서 함수를 호출하고 리턴하면 그 다음 명령어로 오는 것을 생각하시면 됩니다.)



40104F 따라가기

4011A6
주소의 JMP 0040104F 명령을 실행해서 40104F 로 갑니다.


 <Fig. 4>


<Fig. 3> 보다 좀 더 복잡해 보이는 VC++ stub code 가 나타났습니다
실력 향상을 원하시는 분들은 이 코드에서 Step In/Over 를 사용해서 마구 헤매셔야(?) 합니다
함수 호출을 너무 깊게 따라가서 너무 힘든 상황이라고 생각되시면 아래의 ‘디버거 좀 더 능숙하게 다루기’ 내용을 참고하셔서 다시 디버깅 하시면 됩니다.

* 헤매야 하는 이유
여러분이 초보자이기 때문입니다. ^^ 각 컴파일러/버전별로 stub code 를 눈에 익혀 놓으시면실전에서는 stub code 처럼 보이는 부분은 빠르게 뛰어 넘을 수 있습니다
마치 C언어 처음 배울때 컴파일 에러를 많이 내보고, 에러 메시지를 눈에 익히는 것과 같다고 할 수 있습니다실전에서 같은 에러 메시지가 발생했을때 능숙하게 해결하기 위함이지요.



디버거 좀 더 능숙하게 다루기

- Restart [Ctrl+F2] : 다시 처음부터 디버깅 시작. (디버깅 당하는 프로세스를 종료하고 재실행 시킴.)
- Go to [Ctrl+G] : 원하는 주소를 찾아감. (코드를 확인할 때 사용. 실행되는 것은 아님.)
- Execute till Cursor [F4] : cursor 위치까지 실행함 (디버깅 하고 싶은 주소까지 바로 갈 수 있음.)
- Comment [;] : Comment 추가
- User Defined Comments : 마우스 우측 메뉴 -> Search for -> User defined Comment
- Set/Reset BreakPoint [F2] : BP 설정/해제
- Run [F9] : 실행 (BP 가 걸려있으면 그곳에서 실행이 정지됨.)

디버깅을 재실행[Ctrl+F2] 하시고 [Ctrl+G] 단축키로 40104F 주소로 갑니다
40104F 주소에 커서가 놓여져 있을텐데요, [F4] 단축키로 바로 날라갑니다
이곳(40104F) 베이스 캠프라고 부르겠습니다

베이스 캠프로 가는 또 다른 방법은 BP(Break Point) 를 설정[F2] 하고 실행[F9] 하는 것입니다디버거는 현재 실행위치서부터 프로세스를 실행하다가 BP 가 걸린 곳에서 멈추게 됩니다. (BP 없으면 그대로 계속 실행)

그럼 이번에는 [;] 단축키로 주석을 달아 볼까요?


<Fig. 5>


프로그래밍에서와 마찬가지로 디버깅에서 주석은 매우 중요한데요, 커서 위치를 잠시 다른 곳에 두고 'User Defined Comments' 메뉴를 선택하면 아래와 같이 사용자가 입력한 주석들이 표시됩니다. 


<Fig. 6>


빨간 글씨로 표시된 부분이 커서 위치입니다. 
주석 위치와 겹쳐지면 빨간 글씨만 나타납니다. 
(그래서 커서위치를 잠시 다른 곳에 두시라고 한겁니다.)

해당 주석을 더블 클릭하면 그 주소로 갈 수 있습니다
(OllyDbg 를 종료하더라도 주석은 *.udd 파일에 보관되기 때문에 다음에 다시 볼 수 있습니다.)

이어지는 강좌에서 '원하는 코드를 빨리 찾는 방법' 을 가르쳐 드릴텐데요
나중에라도 베이스 캠프에서부터 API 호출을 제외한 모든 함수 호출을 일일이 따라가[F7] 보시는걸 권장합니다

(continue)

'analysis' 카테고리의 다른 글

키로거(KeyLogger) 분석 (3)  (4) 2009/05/03
키로거(KeyLogger) 분석 (2)  (50) 2009/05/03
키로거(KeyLogger) 분석 (1)  (14) 2009/04/24
Lena's Reversing for Newbies #10 (2)  (7) 2009/03/18
Lena's Reversing for Newbies #10 (1)  (16) 2009/03/17
abex' crackme #2 (2)  (27) 2009/03/01
abex' crackme #2 (1)  (32) 2009/02/28
abex' crackme #1  (34) 2009/02/28
"Hello World!" - 내 생애 첫 디버깅 (3)  (40) 2009/02/28
"Hello World!" - 내 생애 첫 디버깅 (2)  (6) 2009/02/28
"Hello World!" - 내 생애 첫 디버깅 (1)  (50) 2009/02/26

Trackback Address :: http://www.reversecore.com/trackback/3 관련글 쓰기

  1. 손띵구리 2009/08/31 15:08 댓글주소 | 수정 | 삭제 | 댓글

    우연히 추천글 목록에 따라 들어가보니 디버깅이라는 것에 대해 저 같은 초보자도 따라할 수 있게 친철히 잘 설명해주셨네요. 조만간 이것저것 해볼께 생겼네요. ^.^

  2. 베리굿 2009/11/07 22:39 댓글주소 | 수정 | 삭제 | 댓글

    감사합니다. 초보자도 잘 이해할것 같아요

  3. 질문 2010/02/10 08:27 댓글주소 | 수정 | 삭제 | 댓글

    코드 창에 노란색, 청록색 배경이나 폰트색이 다르게 표시되는 건 플러그인인가요?
    홈페이지에서 1.10을 받았는데 표시되는 모양이 다르네요;;

    • reversecore 2010/02/10 20:09 댓글주소 | 수정 | 삭제

      안녕하세요~

      OllyDbg 코드창에 마우스 우측 메뉴중에서
      Appearance \ Highlighting \ Christmas tree 를 선택한 거랍니다.

      옵션(font, color, highlighting)을 이리 저리 바꿔보시면 자기만의 고유한 OllyDbg 세팅을 만들 수 있습니다. 한번 해보세요. 재밌어요. ^^

      감사합니다.

    • 감사합니다 2010/02/11 02:52 댓글주소 | 수정 | 삭제

      빠른 답글 감사합니다.
      어영부영 따라해봤는데 재밌네요.
      처음 c언어로 Hello world 찍을 때가 생각났습니다. ^^;

    • reversecore 2010/02/12 00:38 댓글주소 | 수정 | 삭제

      안녕하세요.

      ^^ 맞습니다.

      다른 모든 것과 마찬가지로...
      리버싱의 시작은 호기심과 재미입니다.

      또 들러주세요~~~ ^^

      감사합니다.

  4. 못다한꿈 2010/03/25 14:40 댓글주소 | 수정 | 삭제 | 댓글

    함수는 보통 push ebp로 시작하는데 저 위에 사진 <fig.3>처럼 mov edi,edi를 쓰는 이유가 무엇인가요? 나중에 만약 Inline patch를 위해 남겨두는 여분인가요?

  5. 안정현 2010/06/22 03:20 댓글주소 | 수정 | 삭제 | 댓글

    아 맨뒤쪽이 처음페이지군요. ㅋㅋ 저는 처음부터보라시길래 1번페이지부터
    오늘 10번넘게 반복해서봤는데 이게기초면 하고.. 낙담하고있다가
    여기부터 다시보는중. 정말설명이 잘돼있어요 ㅋㅋ
    감사합니다 ㅋ

    • reversecore 2010/06/22 09:52 댓글주소 | 수정 | 삭제

      안녕하세요.

      와~ 늦은 시간까지 정말 열심이시군요.

      읽으시다 궁금한게 있으면 질문 올려주세요~ ^^

      감사합니다.

  6. hyun 2010/08/15 19:42 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요 궁금한점이있어서 올립니다.

    visual 2008로 소스를 똑같이 만들어서 실행파일을 ollydbg로 열었는데

    처음에

    Module 'API' has entry point outside the code (as specified in the PE header). Maybe this
    file is self-extracting or self-modifying. Please keep it in mind whed setting breakpoints!

    이렇게 뜨고 정확인 EP로 가지 않습니다..

    이럴때는 어떻게 해야하나요? EP를 찾아서 new orgin here로 체크를 해도 다시 CTRL+F2하면

    다시 그자리네요..

    어떡해 해야하나요?

    • reversecore 2010/08/15 22:29 댓글주소 | 수정 | 삭제

      Debug 모드로 컴파일 하셨나요?

      정확한 EP 가 아니라고 하셨는데요...

      진짜 EP 와 OllyDbg 에서 나타나는 EP 가 다르다는 말씀이시죠? PEView 로 확인해 보시기 바랍니다.

      Goto 명령으로 EP 로 갈 수 있습니다만... 왜 그런 현상이 나타날까요? 보통은 packer 류에서 볼 수 있는 메시지 인데 말이죠...

      그리고 Ctrl+F2 라면 디버깅을 다시 하라는 얘기이므로 계속 그자리로 가는 것이 맞습니다.

      감사합니다.

  7. 소매치기 2010/09/06 10:47 댓글주소 | 수정 | 삭제 | 댓글

    정말 자세히 설명되어 있어서 좋은거 같아요 ㅎㅎ
    초보자로써 따라가기 좋게 되어있는것 같습니다. ^^
    감사합니다~

  8. cattyfatty 2010/10/14 16:52 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요!
    리버싱에 관심은 많았는데 어떻게 시작해야 할지 몰라서 고민하고 있었는데, 좋은 강좌 감사합니다!

    강좌보고 하다가 질문이 생겨서요;;
    올려주신 실행파일을 올리디버그로 불러오면 처음 멈추는 곳이 위의 강좌와 같은 위치인데요.
    제가 직접 VC++ 2008로 똑같이 코딩을 해서 해봤는데, 다른곳에 멈추더라고요.
    함수를 콜하는 것에서 멈추는게 아니라, JMP에서 멈추네요;
    함수 실행하지도 않았는데, 점프하라고 하니;;
    어떻게 된건지 이해가 잘 안가네요;;

    • reversecore 2010/10/14 20:46 댓글주소 | 수정 | 삭제

      안녕하세요.

      그 JMP 명령어 주소가 EP 주소와 동일한지 확인해 보시구요.

      Release 모드로 빌드해 보시기 바랍니다.

      그리고 제가 올리는 예제는 빌드 옵션을 일부 변경 시킨 것입니다.

      cattyfatty 님께서 생성한 파일과 다른 모양이 나타날 수 있습니다.

      향후 모든 샘플 예제를 싹 정리해서 프로젝트 파일까지 모아서 올릴 예정입니다.

      감사합니다.

    • cattyfatty 2010/10/15 17:56 댓글주소 | 수정 | 삭제

      아, 그렇군요!
      릴리즈 모드로 빌드하신 거군요...
      빠른 답변 감사드려요 ^^

    • reversecore 2010/10/19 22:06 댓글주소 | 수정 | 삭제

      안녕하세요.

      네, 릴리즈 모드로 빌드 해보신 후 잘 안되시면 다시 연락주시기 바랍니다.

      감사합니다.

  9. reversing 2010/11/06 19:04 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세여 ~~^^

    이런 좋은 강좌를 올려주셔서 감사합니다.!!

    제가 많이 초보라서 그림 하고 똑같이 따라 해보고 싶은데 잘 안되서. 글을 남겼습니다.

    우선 위에 분들처럼 그림 하고 다르게 나오더라고요~
    댓글을 보니 릴리즈 모드로 빌드 하라고 하셨는데

    해도 Hello world 라는 글자는 없고 ntdll 이라는 글자만 나와여 ㅠㅠ 다시 만들어서 해두 그렇네여;; 먼가 잘못됐는지 알수 있을까용?^^

  10. reversing 2010/11/07 08:56 댓글주소 | 수정 | 삭제 | 댓글

    음 이상하네여~ 호환이 안되서 그런건가여?

    윈 xp X32 에서는 그림과 같이 나오는데.

    윈7 X64 에서 돌리면 NTdll 이라 뜨면 전혀 다른곳만 잡네여..

    혹시 왜그런지좀 알수 있을까여?? ollydbg 를 사용했습니다.

    • reversecore 2010/11/07 21:38 댓글주소 | 수정 | 삭제

      안녕하세요.

      최근 64bit 환경과 리버싱 방법에 대한 관련 지식이 매우 중요해 졌습니다. (64bit 관련 내용을 정리는 해놓았으나 아직 블로그에 올리지는 않았습니다.)

      위 프로그램은 32bit 용이고, Windows 7 64bit 환경에서는 OllyDbg 1.10 이 정상 동작하지 않기 때문에 발생하는 문제입니다.

      간단히 OllyDbg 2.0 을 다운 받아 사용하시면 될 것입니다.

      잘 안되시면 다시 질문 올려주세요~

      감사합니다.

  11. Reverser_H 2011/01/19 20:24 댓글주소 | 수정 | 삭제 | 댓글

    궁금점이 있어서 질문드립니다.
    [F4]를 눌러서 실행시킨거와 [F9]를 눌러서 실행시킨 것과
    어떤 차이가 있는지요?
    위의 소스코드로는 두개의 결과과 똑같아서;;
    차이점을 모르겠습니다 ㅠㅠ

    • reversecore 2011/01/19 23:46 댓글주소 | 수정 | 삭제

      안녕하세요.

      [F4] 는 Run to Cursor 이고...
      [F9] 는 Run 입니다.

      즉, [F4] 는 BP + [F9] 라고 보시면 됩니다.

      커서 위치까지만 실행시키는 기능이지요.

      감사합니다

  12. Reverser_H 2011/01/20 00:23 댓글주소 | 수정 | 삭제 | 댓글

    와 감사합니다.

    차이점을 확실히 알수있었습니다 ^^

  13. 콩나물 2011/01/30 13:48 댓글주소 | 수정 | 삭제 | 댓글

    알찬 자료 포스팅에 감사드립니다.

    책도 발간하실것 같은데 꼭 구매해서 보도록 할께요
    (매번 관련 책만 구입하는 1人 ㅎㅎ)

    리버스코어님 새해복 많이 받으세요.

  14. 김태완 2011/02/10 15:54 댓글주소 | 수정 | 삭제 | 댓글

    글 잘읽고 갑니다 ~
    책 발간 하시면 ㅎㅎ바로 구매 하겠습니다~

  15. 리버싱 2011/02/17 19:42 댓글주소 | 수정 | 삭제 | 댓글

    코어님,디스어셈블러의 방식 선형스윕과 재귀순회에 대해서 질문을 드릴게요
    --------------------------------------------------------------------------------
    책에서 선형스윕은 모듈전체를 순서대로 디스어셈하고 재귀순회는 코드 흐름에 따라서 디스어셈한다고 하던데 그러면 재귀순회라면 만약 12345바이트에서 JMP 2409606080(예를 든 주소임)명령어가 있다고하면 12346 바이트는 디스어셈이 안되나요?그러면 12346부터 2409606079까지는 뭐가 들어가나요?기계어?데이터?

    • reversecore 2011/02/18 22:15 댓글주소 | 수정 | 삭제

      안녕하세요.

      문의하신 그 두가지 용어는 처음 들어 봤습니다.

      대부분의 Disassember 는 Instruction 단위로 파싱해서 보여줍니다. 예를 들어 12345 주소의 JMP XXXXXXXX 명령어는 5 byte 크기를 가지므로, 그 다음 명령어는 1234A 주소에 나타나겠지요.

      만약 12345 주소부터 파싱을 하고 싶다면... 가능합니다. 다만 명령어가 깨져 보이겠지요.

      감사합니다.

  16. 피파 2011/02/27 11:37 댓글주소 | 수정 | 삭제 | 댓글

    exe나 dll을 올리디버거로 열때 올리디버거의 (1)code window 칸은 코드섹션을 디어셈하는건가요?

  17. 2011/02/28 12:15 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2011/02/28 15:44 댓글주소 | 수정 | 삭제

      안녕하세요.

      GDB 코드를 보면 스택 프레임도 생성되어 있는데,
      디스어셈 표현 방식이 OllyDbg 와는 좀 틀려 보입니다.

      push 로 stack 에 넣어도 되지만 [ESP+X] 형식으로 넣어도 함수 입장에서 보면 파라미터 입니다.

      보통 VC++ 에서는 PUSH 로 파라미터를 전달합니다.
      혹시 어떤 컴파일러를 쓰셨는지요?

      감사합니다.

  18. TeamKhan 2011/03/02 16:53 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요 질문이잇어서 이렇게 댓글을 남기게되는데요
    베이스캠프부터 시작해서 코드를 분석하라고하시는데
    어떻게분석을하라는거죠??그냥 막막하기만한데요...;
    이부분을 분석해보라고하시는의도를 잘모르겟내요...
    글에서는 stub code를 눈에 익혀두면 다음에 디버깅할떄 뛰어넘을수잇다고
    하시는데 왜 뛰어넘는건지??그리고 어떻게 눈에 익혀야되는지 잘모르겟내요...

    • Stares 2011/03/06 17:23 댓글주소 | 수정 | 삭제

      stub code는 컴파일러가 임의로 넣는 코드입니다.
      솔찍히 분석의 필요가없는 코드이기때문에 넘기는것입니다.

      분석이란.. 어셈코드가 어떻게 진행되는지 알아보는것이 분석입니다..
      그 부분을 분석이 아니라 그 부분부터 분석해 나가라는뜻일겁니다~

    • reversecore 2011/03/10 10:53 댓글주소 | 수정 | 삭제

      안녕하세요.

      Stares 님, 답변 감사드려요~ 너무 잘 설명해 주셨네요~ ^^

      그리고 눈에 익히는 법은요... 간단합니다...
      눈에 익을 때까지 계속 보는 겁니다.
      누구도 예외 없죠. 지름길은 없어요.
      꾸준히 계속 디버깅을 하다보면 실력이 쌓이는 겁니다.

      그런면에서 리버싱은 시간 투자한 만큼 실력이 늘어나는 참 정직한 분야인것 같아요.

      감사합니다.

  19. 수미르 2011/03/10 15:10 댓글주소 | 수정 | 삭제 | 댓글

    리버싱 제대로 공부 해 볼려고 합니다.
    시중에 책도 나와 있지만, 여기 설명이 저한테는 더 와 닿네요.
    감사한 마음으로 강의 잘 보겠습니다.

  20. reverse 2011/03/10 21:02 댓글주소 | 수정 | 삭제 | 댓글

    디버깅 모드로 생성된 파일을 열면 ollydbg로 열게되면

    Module 'HelloWorld' has entry point outside the code (as specified in the PE header). Maybe this file is self-extracting or self-modifying. Please keep it in mind when setting breakpoints!

    이러한 오류가 나는데,, 뭐 때문에 그러는건가요??

    릴리스 모드로 생성된 실행파일은 아무 에러 없이 되네요..

    • reversecore 2011/03/16 23:11 댓글주소 | 수정 | 삭제

      안녕하세요.

      OllyDbg 는 파일을 로딩하고 자체적으로 스캔을 쭉~ 합니다. 그때 EP(EntryPoint) 가 첫번째 코드섹션(".text" 또는 ".CODE")의 바깥쪽에 있다면 저런 에러메시지를 출력합니다.

      하지만 디버그 모드라고 해서 EP 가 코드섹션을 벗어나지는 않을 텐데요~ PEView 나 OllyDbg 에서 직접 확인 해보시기 바랍니다.

      감사합니다.

  21. reversing 2011/04/20 19:10 댓글주소 | 수정 | 삭제 | 댓글

    올리디버그의 dump window 칸엔 원하는 메모리에 있는 아스키값이나 유니코드값으로 나타나 있다고 하셨는데,저기엔 코드영역메모리와 데이터영역메모리(문자열 같은것)모두 들어있나요?
    /아니면 저곳에 모든 섹션영역의 메모리주소가 다 들어있고 ctrl+G 로 원하는 메모리로 간다는 뜻???

  22. forrok 2011/11/08 18:34 댓글주소 | 수정 | 삭제 | 댓글

    디버깅의 디 자도 모르는 사람인데요

    외람된 질문이지만 이런걸 통해서 무엇을 할 수 있죠?

  23. 처음인데... 2011/11/09 09:39 댓글주소 | 수정 | 삭제 | 댓글

    처음이라서 하나도 모르겠는데 뭘 공부해야 이걸 이해할 수 있죠?
    영어로 적어 논게 무슨 말인지 하나도 모르겠네요...

    • cqlee 2012/03/20 12:06 댓글주소 | 수정 | 삭제

      저도 공부를 시작하는 입장인데요
      어셈블리관련서적 어려우시더라도 읽으시면 이해하게 됩니다 ^_^ 아직 잘 모르지만 알아가는 단계라 ^_^

  24. cqlee 2012/03/20 12:06 댓글주소 | 수정 | 삭제 | 댓글

    위 cpp 소스코드를 컴파일 하여 생성된 .obj 파일을 cl 명령어를 이용해서 실행파일을
    만드려고 링크 에러를 잡느랴고 고생했습니다 단 한줄 위에 써 넣으면 되는 것을 ㅋㅋㅋ
    오류를 잡을땐 기분좋습니다. ㅋㅋㅋ

    고맙습니다 ^^

  25. tjdrua74 2012/04/03 15:06 댓글주소 | 수정 | 삭제 | 댓글

    좋은강좌 잘 봣습니당
    이제 막 리버싱배우는데
    리버싱책보면서 같이보면 이해가 더 잘 되겠네여
    아 그리고 보면서 질문이 생겼어요
    전 집에서 visual c++2010 쓰는데 주소값출력되는게 다른가요??