abex' crackme #2 (1)

analysis 2009/02/28 23:31



* 출처 : http://www.simples.co.kr/RCEZone



abstract

abex’s crackme #2 파일을 디버깅합니다.



Goal

- 아주 간단한 crackme 파일을 분석하여 디버거와 디스어셈 코드에 익숙해집니다.
- Visual Basic 의 파일 구조를 간단히 살펴보고 분석 방법을 배워봅니다.



Prologue

지난 번에 이어서 abex' crackme 두번째 파일을 분석해보도록 하겠습니다.

두번째 파일은 Visual Basic 으로 제작되었으며,
Visual C++ 혹은 Assembly 로 작성된 파일과는 또 다른 파일 형태를 경험 하실 수 있습니다.

* 설명에 나온 메모리(스택) 주소들은 사용자의 PC 환경에 따라 변경됩니다.
   디버깅 하실 때 이점을 감안하시기 바랍니다.

* 디버깅이 어렵게 느껴진다면 그건 자연스러운 현상입니다.
   꾸준히 노력과 시간을 투자한다면 결국 익숙해지실 것입니다.




VirusTotal 검사

디버깅 할 파일의 안전성을 확인하기 위해 www.virustotal.com 을 이용하시기 바랍니다.


<Fig. 1>



abex' crackme #2

일단 실행시켜서 어떤 프로그램인지 알아봐야겠죠?


<Fig. 2>

전형적인 crackme 의 형태인 serial key 알아내기 프로그램입니다.
Name 을 따로 입력받는 걸로 봐서 Serial 값을 생성할 때 Name 문자열이 사용될 것 같습니다.

Name 과 Serial 을 적절히 입력하고 [Check] 버튼을 눌러봅니다.


<Fig. 3>

"Wrong serial!" 메시지 박스가 출력됩니다.
다른 값으로 몇 번을 시도해도 같은 메시지 박스가 나타납니다.

디버깅을 시작하기 전에 Visual Basic 파일의 특징을 살펴보겠습니다.



Visual Basic 파일 특징

먼저 Visual Basic (VB) 파일 특징에 대해 간단히 설명드리겠습니다.

1) VB 전용 엔진

VB 파일은 MSVBVM60.dll (MicroSoft Visual Basic Virtual Machine 6.0) 이라는 VB 전용 엔진을 사용합니다.
(The Thunder Runtime Engine 이라는 이름으로도 불리고 있습니다.)

VB 엔진의 사용 예를 들어보면 메시지 박스를 출력하고 싶을때 VB 소스 코드에서 MsgBox() 함수를 사용합니다.
VB 컴파일러는 실제로 MSVBVM60.dll!rtcMsgBox() 함수가 호출되도록 만들고,
이 함수 내부에서 Win32 API 인 user32.dll!MessageBoxA() 함수를 호출 해주는 방식으로 동작합니다.
(VB 소스 코드내에서 user32.dll!MessageBoxA() 함수를 직접 호출 하는 것도 가능합니다.)

2) N(Native) code, P(Pseudo) code

VB 파일은 컴파일 옵션에 따라서 N code 와 P code 로 컴파일이 가능합니다.

간단히 설명드리면 N code 는 일반적인 디버거에서 해석 가능한 IA-32 명령어를 사용하는 반면에,
P code 는 인터프리터(Interpreter) 언어 개념으로서 VB 엔진으로 가상 머신을 구현하여
자체적으로 해석가능한 명령어(바이트 코드)를 사용하는 것입니다.

따라서 VB 의 P code 를 정확히 해석하려면 VB 엔진을 분석하여 에뮬레이터를 구현하여야 합니다.

* P code 의 사용 예로 JAVA (JAVA Virtual Machine), Python (Python 전용 엔진)등이 있습니다.

* P code 를 사용했을때의 장점은 이식성이 좋아진다는 것입니다.
  (플랫폼 별로 엔진을 제작/배포하면 다른 플랫폼 에서 기존의 사용자 코드를 거의 수정없이 그대로 사용 가능합니다.)

3) Event Handler

VB 는 주로 GUI 프로그래밍을 할 때 사용되며, IDE 인터페이스 자체도 GUI 프로그래밍에 최적화 되어 있습니다.

즉, VB 프로그램은 Windows 운영체제의 event driven 방식으로 동작하기 때문에
main() 혹은 WinMain() 에 사용자 코드(우리가 디버깅을 원하는 코드)가 존재하는 것이 아니라,
event handler 에 사용자 코드가 존재합니다.

위의 abex' crackme #2 에서는 [Check] 버튼 handler 에 사용자 코드가 있겠지요.

4) undocumented 구조체

VB 에서 사용되는 각종 정보들(Dialog, Control, Form, Module, Function, etc)은
내부적으로 구조체 형식으로 파일에 저장됩니다.

MicroSoft 에서는 이러한 구조체 정보를 공개하지 않았기 때문에 VB 파일의 디버깅에 어려움이 있습니다.

* Visual Basic 파일 포멧은 그 자체로 흥미로운 부분이 많이 있기 때문에,
   향후 VB 파일 포멧에 대한 상세한 분석을 해보도록 하겠습니다.



Start debugging

OllyDbg 를 실행시켜 abex' crackme #2 파일의 디스어셈 코드를 살펴보겠습니다.


<Fig. 4>

프로그램이 시작되면 처음 하는 일은 VB 엔진의 메인 함수(ThunRTMain)를 호출하는 것입니다.

00401232    FF25 A0104000    JMP DWORD PTR DS:[4010A0]    ; MSVBVM60.ThunRTMain
00401238    68 141E4000      PUSH 401E14                  ; => EP
0040123D    E8 F0FFFFFF      CALL 00401232                ; <JMP.&MSVBVM60.#100>

RT_MainStruct 구조체 주소(401E14)를 파라미터로 넘기고 VB 엔진의 메인 함수인 ThunRTMain() 를 호출합니다.

위 3 줄의 코드가 VB 파일의 startup 코드의 전부입니다.

간단하긴 하지만 아래 3 가지 항목은 눈여겨 볼 필요가  있습니다.

1) 간접호출 (Indirect Call)

40123D 주소의 CALL 명령은 ThunRTMain() 함수 호출 인데요, 조금 특이한 기법을 사용합니다.
MSVBVM60.dll!ThunRTMain() 으로 직접 가는 것이 아니라, 중간의 401232 주소의 JMP 명령을 통해서 갑니다.

이 기법은 VC++, VB 컴파일러에서 많이 사용하는 간접호출(Indirect Call) 기법입니다.

* 참고로 4010A0 주소는 IAT(Import Address Table) 영역이며 MSVBVM60.ThunRTMain() 함수의 실제 주소가 담겨있습니다.
   향후 PE header 설명할 때 IAT 에 대해 자세히 설명드리겠습니다.

2) RT_MainStruct 구조체

우리가 주목할 부분은 ThunRTMain() 함수의 파라미터인 RT_MainStruct 구조체 입니다.
여기서는 401E14 주소에 RT_MainStruct 가 존재합니다.


<Fig. 5>

MS 에서 RT_MainStruct 를 공개하지 않았지만, 이미 실력있는 해외 리버서들이 분석을 완료하고 인터넷에 공개하였습니다.

RT_MainStruct 구조체의 멤버는 또 다른 구조체의 주소들입니다.

즉, VB 엔진은 파라미터로 넘어온 RT_MainStruct 구조체를 가지고
프로그램의 실행에 필요한 모든 정보를 얻는다는 걸 알 수 있습니다.

* 나중에 VB 파일 포멧 분석할 때 멤버 하나씩 살펴보도록 하겠습니다.

3) ThunRTMain() 함수

참고로 ThunRTMain() 함수가 나온김에 어떻게 생겼는지 살펴 보겠습니다.


<Fig. 6>

<Fig. 6> 는 ThunRTMain() 코드의 시작부분입니다.

메모리 주소가 완전히 틀려진 것이 보이시죠?

이 주소는 MSVBVM60.dll 이 로딩된 주소입니다.

VB 파일의 대한 설명은 이정도로 마치도록 하고 abex' crackme #2 로 돌아가겠습니다.



단서를 찾아라!

도대체 우리가 보고 싶은 "패치 해야 할 코드" 는 어디 있을까요?

지금 수준에서 RT_MainStruct 구조체를 분석하는 것은 쉽지 않을테니, 좀 더 간단한 방법을 생각해 봅니다.

역시 간단히 떠오르는 생각은 <Fig. 3> 의 에러 메시지 박스와 그 문자열을 단서로 해서 시작하면 될 것 같습니다.



문자열 검색

OllyDbg 의 문자열 검색 기능(All referenced text strings) 을 사용하면 아래와 같은 윈도우가 나타납니다.


<Fig. 7>

아까 본 메시지 박스의 문자열을 확인 하였습니다.

해당 문자열을 더블 클릭하여 이 주소로 가봅니다.


<Fig. 8>

메시지 박스의 타이틀, 내용 그리고 실제 메시지 박스 함수 호출 코드(4034A6)까지 나타났습니다.

프로그래밍 관점에서 생각해보면, 어떤 알고리즘으로 시리얼 키를 생성하고
사용자가 입력한 키와 문자열 비교를 통해서 각각 TRUE(키가 같음) 와 FALSE(키가 틀림) 로 코드가 갈라질 것입니다.

즉, 위 코드 전후에 문자열 비교 코드, 그리고 키가 맞았을 때 출력될 성공 메시지 박스 호출 코드가 존재할 것입니다.
(키가 맞았을때 메시지 박스가 호출될 꺼라는 것은 <Fig. 7> 의 문자열을 보고 유추한 내용입니다.)

<Fig. 8> 에서 스크롤을 조금 올리다 보면 과연 (추측한대로) 분기문을 포함한 코드가 나타납니다.


<Fig. 9>

403329 주소의 __vbaVarTstEq 함수를 호출해서 리턴값(AX) 를 비교(TEST 명령) 한 후
403332 주소의 조건 분기(JE 명령)에 의해서 참, 거짓 코드로 분기하게 됩니다.

* 위 코드에서 사용된 어셈블리 명령어 설명

TEST : 논리 비교 (Logical Compare)
           bit-wise logical ‘AND’연산과 동일 (operand 값이 변경되지 않고 EFLAGS 레지스터만 변경됨)
           두 operand 중에 하나가 0 이면 AND 연산 결과는 0 → ZF = 1 로 세팅됨

JE : 조건 분기 (Jump if equal)
       ZF = 1 이면 점프



문자열 찾기

<Fig. 9> 에서 403329 주소의 __vbaVarTstEq 함수가 문자열 비교 함수라면,
그 위에 있는 두 개의 PUSH 명령어는 비교 함수의 파라미터 - 즉, 비교 문자열이 될 것입니다.
(C 언어의 strcmp 함수를 떠올려서 추측한 것입니다.)

403329 주소까지 가보겠습니다. 403329 주소에 BP 를 설치하시고 실행[F9]해 주세요. 메인 다이알로그가 나타나고 <Fig. 3> 과 같이 입력하신 후 [Check] 버튼을 누르시면 403329 주소에 멈추게 됩니다.

00403321    LEA EDX,DWORD PTR SS:[EBP-44]
00403324    LEA EAX,DWORD PTR SS:[EBP-34]
00403327    PUSH EDX                             ; 0012FBDC
00403328    PUSH EAX                             ; 0012FBEC
00403329    CALL DWORD PTR DS:[<&MSVBVM60.__>    ; MSVBVM60.__vbaVarTstEq

이 상태에서 스택을 보면 아래와 같습니다. (스택의 주소는 디버깅 환경에 따라 달라집니다.)


<Fig. 10>

00403321 주소의 SS:[EBP-44] 는 무엇을 나타내는 걸까요?

 IA-32 Register 기본 설명 에서 SS 는 스택 세그먼트(Stack Segment) 이고, EBP 는 베이스 포인터(Base Pointer) 레지스터라고 소개했었습니다.

즉, SS:[EBP-44] 주소가 의미하는 것은 스택내의 주소를 말하는데 ,
이것이 바로 함수내에서 선언된 로컬 객체의 주소 입니다 .
(로컬 객체는 스택에 저장되는걸 아시죠~)

해당 메모리 주소([EBP-44] = [12FBDC]) 를 보면 아래 그림과 같습니다.


<Fig. 11>

* 참고
OllyDbg 에서 주소를 직접 입력하지 않고 편하게 찾아가는 명령이 있습니다.
<Fig. 9>의 Code 윈도우에서 마우스로 403321 주소를 선택하신 후 마우스 우측 메뉴의 'Follow in dump → Memory address' 명령을 쓰시면 됩니다. 또는 <Fig. 10> 에서 마우스로 12FAB8 (12FBDC) 주소를 선택하신 후 마우스 우측 메뉴의 'Follow in dump' 명령을 사용하시면 됩니다.

VB 의 문자열은 C++ 의 string 클래스 객체와 마찬가지로 가변 길이 문자열 타입을 사용합니다.

따라서 <Fig. 11> 에서 보는 바와 같이 바로 문자열이 나타나지 않고 16 byte 크기의 데이타가 나타납니다.
(이것이 바로 VB 에서 사용하는 문자열 객체일 것입니다.)

다른 값들은 동일하고 노란색으로 표시된 부분의 값이 틀린데 메모리 주소처럼 보이네요.
(가변 문자열 타입은 내부에 -동적으로 할당한- 실제 문자열 버퍼 주소를 가지고 있습니다.)

OllyDbg 의 메모리(덤프) 윈도우에서 마우스 우측 메뉴의 Long – Address with ASCII dump 명령를 선택합니다.

이 명령은 메모리 윈도우의 보기 형식을 마치 스택 윈도우처럼 변경하고,
특히 문자열 주소인 경우 해당 문자열을 표시해줍니다.
(원래대로 보고 싶을때는 마우스 우측 메뉴의 Hex – Hex/ASCII (16 bytes) 명령)
 

<Fig. 12>

위 그림에서 알 수 있듯이 결국 EDX(0012FBDC) 는 실제 serial 값이고,
EAX(0012FBEC) 는 사용자가 입력한 serial 값입니다.
(참고로 VB 는 UNICODE 문자열을 사용합니다.)

이 노란 주소 부분을 찾아가서 보면 실제 문자열을 확인할 수 있습니다.



<Fig. 13>

Crackme 프로그램을 실행해서 Name = "ReverseCore", Serial = "B6C9DAC9" 로 입력해보면
아래와 같이 성공 메시지 박스가 출력됩니다.


<Fig. 14>

Serial 을 찾았으니 크랙은 성공했다고 할 수 있습니다.

그런데 Name 이 Serial 과 어떤 관계가 있을까요?
Name 에 다른 값을 주고 동일한 Serial 을 입력하면 틀렸다고 나옵니다.

역시나 Name 문자열을 기반으로 Serial 을 그때 그때 생성하는 알고리즘입니다.

(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/9 관련글 쓰기

  1. 메롱이 2009/11/20 02:06 댓글주소 | 수정 | 삭제 | 댓글

    언제나 강좌 재미있게 읽고 갑니다..

    다른분들의 리버싱 강좌에 비해 엄청 세련되고 자세하다는 느낌을 받습니다...초보로서..@@

    그래서 너무나 잼있게 읽게 되는것 같습니다...

    그리고 느낀게..

    역시 고수분들은..글도 잘쓰시는거 같다는..@@

    하루에 한번은 꼭 들어오는 블로그예요..ㅋㅋㅋ

    앞으로도 잼있는 강좌 계속 부탁드립니다..헤헤..

  2. ㅎㅎ 2010/02/06 10:59 댓글주소 | 수정 | 삭제 | 댓글

    강좌 재밌게 보고 갑니다

    리버싱에 대한 기초를 여기서 다 다지게 되네요

    감사합니다

  3. upx 2010/03/02 02:15 댓글주소 | 수정 | 삭제 | 댓글

    다시해보니 새롭네요..그냥 점프하는거보다 키젠미도 괜찮은데요..

    • reversecore 2010/03/04 00:17 댓글주소 | 수정 | 삭제

      upx님, 안녕하세요.

      대부분 위와 같은 크랙미를 풀면서 리버싱을 시작하시는것 같습니다.

      일단 재밌으니까요.

      재미를 느끼고 새로운 것을 배우는게 좋은것 같습니다.

      감사합니다.

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

    모든 강좌 잘 보고 있습니다!^^
    궁금한점이 있습니다!위 강좌에서 간접호출 쓰는 이유가 뭔가요?~

    • reversecore 2010/03/25 22:35 댓글주소 | 수정 | 삭제

      못다한꿈님, 안녕하세요.

      VC++, VB 등의 고급언어 개발도구에서 간접호출을 사용하는 예를 많이 봤습니다.

      저도 그 이유가 궁금합니다. 그냥 CALL DWORD PTR [] 하면 되지 왜 굳이 CALL + JMP DWORD PTR [] 나를 할까요? 코드도 늘어나고 실행 시간도 길어지는데 말이죠.

      혹시 이유를 알게 되시면 저에게도 공유해주시기 바랍니다.

      감사합니다.

  5. ㅇㅇ 2010/05/17 16:03 댓글주소 | 수정 | 삭제 | 댓글

    와~ 정말 강좌 재미있게 보고갑니다!
    항상 좋은글 감사해요~

  6. 와우 2010/07/19 15:25 댓글주소 | 수정 | 삭제 | 댓글

    좋네요~
    리버싱 공부중인데 좋은 강좌 감사합니다.
    처음 접하는 사람들이 크랙쪽으로 많이 접근해서 배운다는데
    저도 열심히 해야겠군요 ㅎㅎ

    • reversecore 2010/07/19 23:13 댓글주소 | 수정 | 삭제

      크랙은 확실히 초보자에게 흥미를 끄는 부분이 많이 있습니다.
      하지만 너무 빠져 들면 곤란하겠지요? ^^

  7. 질문드립니다 2010/07/24 21:56 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요
    강좌 정말로 잘 보고있습니다. 진심으로 감사드린다는 말씀 드리고싶네요

    이 강좌에 질문이 하나 있는데요
    test연산과 je 에 관련하여 질문드립니다

    test연산이 두 연산자을 AND연산하여서 결과가 0이나오면 ZF =1
    결과가 1이나오면 ZF = 0이고
    JE가 ZF=1이면 Jump라 하는거라 하셨는데요
    ZF가 1이면 AND연산값이 0, 즉 두 연산자가 다르다는 말인데
    왜 JE(Jump if Equal)인지 궁금합니다.
    더불어 연산자들도 1비트가 아닌 여러 비트로 이루어져있을텐데..
    예를들면 test 1010111(2),1011111(2)

    이 크랙에선 test ax,ax인데 ax에 0이 들어가잇더군요
    연산자중 하나가 0이거나 둘이 보수일때 Jump?


    머릿속에 정리가 잘 되지않네요 ..;;답변두탁드릴꼐요

    • newbie 2010/07/25 20:37 댓글주소 | 수정 | 삭제

      JE가 Jump if Equal의 의미로 쓰일때는 cmp문이랑 같이 쓰일때입니다.
      cmp문은 두 피연산자를 빼서 결과를 내기 때문에 같으면 ZF를 1로 만들고 그러므로 JE이 동작하게 되는겁니다.
      TEST문과 JE를 쓰면 주로 피연산자가 0인지 아닌지 확인하는 용도로 쓰기위함입니다. TEST문은 AND 연산이기때문에 피연산자가 0이거나 1인 비트가 전혀 겹치지 않아야 ZF를 1로 만들죠. 보수 관계등을 알기 위해 쓸 수도 있겠지만 대부분의 경우 피연산자는 TEST EAX, EAX 같이 두개를 같은 것을 두고 피연산자 값이 0이면 점프하는 용으로 쓰인다고 보시면 될 것 같습니다. 결과적으로 궁금해하신 Jump if Equal의 의미는 cmp문이랑 같이 쓰일때 그 의미를 가진다고 생각하시면 될 것 같습니다.

    • reversecore 2010/07/28 16:50 댓글주소 | 수정 | 삭제

      안녕하세요.

      newbie님께서 자세히 잘 설명해 주셨네요.
      (같은 피연산자 ax를 비교하였으므로 0 이면 점프하라는 뜻이지요.)
      newbie 님, 감사합니다. ^^

      test ax, ax => ax 와 ax 를 비교하죠?
      je XXXX

      위 구문은 아래 C 코드로 해석하실 수 있습니다.

      if (ax == 0) { goto XXXX; }

  8. 주황 2010/08/19 21:19 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    주황 입니다.

    한동안 너무 바빴다가 짬짬이 들려 공부하고 있습니다.
    굉장히 쉽고 자세히 설명해주시는데 이해력이 딸려서 너무 어렵네요.

    우선 잘 안되는 부분 질문 드립니다.

    403329 까지 디버깅 합니다. 는 어떻게 해야 하나요? 403329에 bp 걸고 f9 하면 되는건가요?

    아.. 여기 이하로 꽉 막혔네요..
    일단 Fig. 10 을 확인 못하고 있습니다.

    Follow in dump -> Selection 이라는 메뉴 밖에 없고요 이 메뉴를 따라가봐도 Fig. 11 처럼 안나오네요..ㅠㅠ

    주소를 403321 을 따라 갔는데 Fig. 11 과 12 는 왜 12FBDC 주소가 나타나는 건가요?
    저는 403321 그대로 나오거든요..
    무엇을 잘못하고 있는건지.. 도무지 모르겠습니다.
    부디 좀 더 자세한 설명 부탁드리겠습니다.

    아.. 그리고 덤프윈도우의 Comment 탭은 어떻게 나오는건가요? 이것저것 다 눌러봐도 안나타 나네요.

    그럼 답변 부탁드리겠습니다.
    감사합니다.

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

      안녕하세요.

      디버깅 하시는 중에 막히셨군요...

      1) 403329 에 BP 걸고 F9 맞습니다. ^^

      2) <Fig. 10> 그림으로 설명드리면,
      이게 스택 윈도우이므로 12FAB8 (12FBDC) 를 선택하신 후 마우스 우측 버튼의 메뉴의 "Follow in dump" 를 사용하시면 덤프 윈도우에 <Fig. 11> 과 같은 그림이 나타납니다.
      이 방법외에 <Fig. 9> 그림의 코드 윈도우에서 403321 주소를 선택하신 후 마우스 우측 메뉴의 "Follo in dump - Memory address" 명령을 사용하셔도 <Fig. 11> 그림이 나타납니다.

      3) dump 윈도우에는 comment 탭이 없습니다. 위 그림은 제가 설명을 위해서 임의로 그려 넣은 것입니다.

      저도 지금 다시 글을 읽어보니... 과연 리버싱 초보분들께서 이해하기 어려운 부분이 많이 보이네요.

      주황님의 소중한 지적을 바탕으로 본문을 수정하도록 하겠습니다.

      제가 바라는 것이 리버싱 초보분들의 눈높이에서 쉽게 설명하는 것이었는데, 이렇게 좋은 피드백을 주셔서 감사합니다. 큰 도움이 되었습니다.

      공부하시다가 잘 이해안가시는 부분이 있으면 또 문의해 주세요~

      감사합니다. ^^

  9. 리버싱입문자 2010/12/16 11:37 댓글주소 | 수정 | 삭제 | 댓글

    초보라서 어렵긴 하지만

    그래도 다른분들이 쓴 내용보다 쉽게 되 있어서

    어느정도(?)는 할수있네요 ~

    흐름은 전체적으로 이해가 됐으니 이제 세부적인 것도 이해해야겠어요 ㅠ

    • reversecore 2010/12/16 15:13 댓글주소 | 수정 | 삭제

      안녕하세요.

      흐름만 이해를 하셔도 대단한거랍니다.

      열심히 리버싱하시고 종종 방문해 주세요~

      감사합니다.

  10. 오늘도 2011/01/13 19:50 댓글주소 | 수정 | 삭제 | 댓글

    리버싱 학습할 때, 문제를 스스로 만들면서 하면 좋을 듯 합니다.

    Name = TEST 이면, Serial은 어떻게 될까?
    처럼 학습하면 좋을 것 같습니다. 답은) B8A9B7B8

    • reversecore 2011/01/14 11:56 댓글주소 | 수정 | 삭제

      안녕하세요.

      좋은 의견입니다.

      시리얼 생성 알고리즘을 확실히 분석하지 않으면 풀 수 없는 문제겠군요. (단순 점프명령어 패치로는 할 수 없지요.)

      감사합니다.

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

    오늘도 매우 재미있게 공부합니다 ㅋ

  12. 대단하세요 2011/03/11 17:51 댓글주소 | 수정 | 삭제 | 댓글

    잘안되서 머리막쥐어짜고 짜증만나네요..

    올리디버거버전이 틀린건지 fig10에서 0013으로되어있고 그옆에 EAX 글자들이 전혀없어요

    그래서 더밑으로진행을못하고.. ㅠ;;

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

      안녕하세요.

      버전 문제가 아니구요... ^^

      EAX 는 제가 그림에 적어 넣은 것이라 OllyDbg 에서는 보이지 않는답니다.

      다른곳에 올려주신 질문에도 비슷한 내용을 올려주셨죠? 매우 죄송하구요. 섬세한 지적 감사합니다.

  13. 리버싱생초보 2011/06/27 01:51 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세여 올려주신 글마다 질문을 올리는것같네여;;

    이번 글에서는 Test AX,AX 에서 똑같은걸 왜 비교하는 지 모르겟네여;;

    그리고 마지막부분에서 노란색 부분을 찾아가서 실제 문자열을 보는건 어떻게하져??

    • reversecore 2011/06/29 12:07 댓글주소 | 수정 | 삭제

      안녕하세요.

      그건 Assembly 문법인데요...

      <그림 9> 의 40332F 주소를 보시면 아래와 같은 명령어가 있습니다.

      TEST AX, AX
      JE 403408

      C언어로 해석하면 개념은 대충 이렇습니다.

      if AX == 0
      goto 403408


      그리고 유니코드 문자열을 보시려면...
      OllyDbg 의 메모리(덤프) 윈도우에서 이동[CTRL+G] 명령으로 원하는 주소로 간 다음...
      마우스 우측 메뉴의 Long – Address with ASCII dump 명령를 선택하시면 됩니다.

      감사합니다.

  14. bypass 2011/09/23 11:40 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요. 이 크랙미 문제에 대해 질문 있습니다.
    ReverseCore님이 언급한 코드부분에 (가장 중요한 흐름분기 일어나는 부분) 브레이크포인트를 걸고, F9명령어로 "계속" 진행을 시켜도, abex crackme.exe의 실행 창이 제대로 뜨질 않습니다.(F9를 누르면 한번에 떠야 할 것 같은데) 다 떴다가도 마우스로 클릭하면 비활성화(최소화) 된다던가 하는데, F9를 눌러도 계속 0x7D??????부근에서 왔다갔다 하는걸보니 vb엔진이나 모듈의 함수에 갇혀서 순환하는 것 같습니다.
    ollydbg 의 옵션 문제인것 같은데 혹시 어느 항목이었는지 알려주실 수 있나요? 아니면 ollydbg.ini 설정파일이라도 제공해주시면 제가 일일이 찾아보겠습니다..
    생각해보니 지뢰찾기 리버싱 할때도 분명히 프로그램이 거쳐갈 만한 곳에 브레이크포인트를 잡아놨는데 아무리 F9를 눌러도 이상한데서 무한반복을 하고 있어서 고생했던 것 같네요. 조언 좀 주시면 감사하겠습니다.
    (좀더 연구해보니 ollydbg 2.0에서는 이런 현상이 일어나지 않고, ollydbg 1.1에서만 일어나네요. 그리고 1.1에서 Trace option의 'alwyas trace over system dll'옵션도 시도해봤는데 역시 해결이 안됩니다.)

    • reversecore 2011/09/28 20:45 댓글주소 | 수정 | 삭제

      안녕하세요.

      안티디버깅이 없는 일반적인 경우라면 OllyDbg 에서 실행[F9] 했을 때 <Fig. 2> 그림이 나타나야 합니다.

      그렇지 않다면... 혹시 plugin 이 설치되어 있는지 확인해 보시기 바랍니다. 어떤 플러그인은 버그가 많아서 디버깅에 오히려 방해가 된답니다. plugin 폴더를 rename 하신후 OllyDbg 를 재실행 해보시기 바랍니다.

      감사합니다.

  15. 낭만고양이 2011/09/26 21:43 댓글주소 | 수정 | 삭제 | 댓글

    ReverseCore님 안녕하셰요.
    강좌 잘 보고 나갑니다.
    근데, bypass님은 아직도 강좌를 이해하지 못하셨는데요. 그건 Shift+F9을 눌러 보셰요.
    ㅋㅋㅋ
    조언 감사

  16. kunta 2012/02/18 05:12 댓글주소 | 수정 | 삭제 | 댓글

    잘보고 갑니다 ^^
    어셈 배우면서 리버싱도 재미로 하려고 했는데

    제 머리로는 도무지 재미로 않되네요 ㅜㅠ
    아무튼 잘보고 갑니다 ㅋㅋ


◀ PREV : [1] : ... [82] : [83] : [84] : [85] : [86] : [87] : [88] : [89] : [90] : ... [93] : NEXT ▶