2009년 11월 11일 수요일

[분기 Crack] abex 1 Crack

제목 : abex #1

목적 : 프로그램 내 분기를 파악하여 변형 시킨다.

파일명 : abexcm1.exe (첨부파일)

내부 로직 :

GetDriverType을 얻어와 해당 값을 감소 시키고

비교 값을 증가 시켜 결과를 나타나게 한다.

GetDriverType결과 값 감소, 감소 (결과값 -2)

VS

비교값 증가, 증가, 증가 (3)

-> 같을 경우 : success

-> 다를 경우 : fail

GetDriverType Return 값은 현재 '3'의 값을 Return 시키고 있다.

결론 적으로 '3' - '2' VS '3' = 같지 않음.

같지 않은 경우 -> Fail 창 보임

성공을 위해서는 Return 값이 '5'가 되어야 함.

 

입력 값 변환 Logic :

1. 분기문을 강제 수정(가장 많이 쓰인 방식 - naver상 검색 결과는 대부분 이 방식)

2. 해당 감소문 NOP 처리(여기서 사용한 방식)

-40101E 주소라인 NOP처리

-401023 주소 라인 NOP처리

사용 Tool : OllyDbg

난이도 : ★☆☆☆☆

-------------------------------------------------------------------------------

Debug 화면 Capture

1. 내부 Logic 점검 (8라인 부터 15번 라인)

2. 해당 API 점검 (GetDriverType) (현재는 '3' Drive Fixed 값이 Return 됨 - 5가 Return 되어야 Success 가능)

3. Return 값 수정이 어려운 관계로 감소 부분을 NOP 처리 시킴(9,13 라인)

                                                                                                                               

4. Success

 

Crack me #1

제목 : Crack me #1

목적 : 시리얼을 프로그램 내부에서 추출 하여 시리얼 생성기를 만든다.

파일명 : due-cm1.exe (첨부파일)

내부 로직 :

미리 정의 되어있던 시리얼 값

"0x7B,0x61,0x65,0x78,0x64

,0x6D,0x26,0x6B,0x7A,0x69

 ,0x6B,0x63,0x65,0x6D,0x26

 ,0x3C,0x26,0x66,0x6D,0x7F

 ,0x6A,0x61,0x6D,0x7B,0x26

 ,0x6A,0x71,0x26,0x6C,0x7D

 ,0x6D,0x64,0x61,0x7B,0x7C"

과 사용자가 입력한 값을 비교해서 정확히 일치 할 경우 Success 하는 프로그램

입력 값 변환 Logic :

사용자 입력값을 3번에 걸쳐서 변환 시킨다.

a(사용자 입력 값) xor 0x43

a xor 0x1E

a xor 0x55

 

시리얼 생성기 프로그램 소스 :

#include <vector>

#include <cstdio>

#include <string>

#include <sstream>

using namespace std;

 

int main()

{

    char a[35] = {0x7B,0x61,0x65,0x78,0x64

                 ,0x6D,0x26,0x6B,0x7A,0x69

                 ,0x6B,0x63,0x65,0x6D,0x26

                 ,0x3C,0x26,0x66,0x6D,0x7F

                 ,0x6A,0x61,0x6D,0x7B,0x26

                 ,0x6A,0x71,0x26,0x6C,0x7D

                 ,0x6D,0x64,0x61,0x7B,0x7C

                 };

    int b = 35;

    for(int i = 0 ; i < b; i++){

            a[i] = a[i]^0x43;

            a[i] = a[i]^0x1E;        

            a[i] = a[i]^0x55;

    }

    printf("%s",a);

    scanf("%d",&b);

}

사용 Tool : OllyDbg

난이도 : ★★☆☆☆

-------------------------------------------------------------------------------

Debug 화면 Capture (ㅠ,.ㅠ 에잇~ 이미지 잘못 올렸네요~ 다음꺼 올릴때는 잘올리겠습니다. ^^)

1. 임의 값을 입력해서 프로그램 내부 Logic 점검

2. 내부 Logic파악과 비교 대상이 되는 String 파악

3. 파악된 Logic과 String을 대상으로 Key generator 개발

4. Success

11월 퀴즈 및 정답

1. 봉식씨는 모두 8개의 구슬을 갖고 있습니다. 그런데 이중 단 1개의 구슬만 조금더 무겁습니다. 봉식씨는 양팔저울을 단 2번만 사용 할 수 있는데요~ 어떻게 해야 이 1개의 구슬을 찾을 수 있을까요?

펼쳐두기..

2. 당신은 아무것도 없는 텅빈 공간에 서있습니다. 이 공간에는 물이 가득 찬 정 원통형 유리컵하나만 있습니다. 당신은 정확힌 50%의 물만을 컵에 남겨 놓은 채 나머지 50%의 물을 이 공간에 버려야만 합니다. 그러면 탈출 할 수 있습니다. 자 어떻게 탈 출할 수 있을까요?

펼쳐두기..

3. 다음 코드에서 print문을 실행 시키고 싶습니다. 어떻게 해야할까요? 그리고 무슨 이유 때문에 그렇게 해야할까요?(이유가 중요합니다. ^^)

 #include<stdio.h>

  #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))

  int array[] = {23,34,12,17,204,99,16};

  int main()  {

      int d;

      for(d=-1;d <= TOTAL_ELEMENTS-2;d++)          

                 printf("%d\n",array[d+1]);

      int a;

      scanf("%d",&a);

      return 0;  

}

펼쳐두기..

4. 당신은 공주를 구하기 위해서 사막을 건너야 합니다. 이 사막을 건너는 데는 정확히 5일이 걸립니다. 그리고 한 사람이 들고 갈수 있는 식사량은 정확히 3일 치(3끼 기준입니다) 뿐입니다. 당신은 몇명이든 당신과 같은 조건을 갖는 일꾼을 고용할 수 있습니다. 과연 최소한 몇명의 일꾼을 데리고 가야 당신은 무사히 사막을 건널 수 있을까요?

추가 : 3끼중 단 한끼도 굶을 수 없습니다. 물론 일꾼도 마찬가지 입니다.

         어느 누구도 사막에 버려질 수 없습니다. 반듯이 살아야 합니다.

         도착 하고자 하는 상대편에서 어느 누구도 마중 나올 수 없습니다.

         일꾼은 반듯이 같은 날 동시에 일행들과 출발 해야 합니다.

펼쳐두기..

5.  3개의 모래시계가 있는데, 각각 12, 15, 20분짜리입니다.
이것들만 이용해서 7분을 재고 싶다면 어떻게 해야 할까요?
물론, 7분을 재기 전에 준비하는 시간이 최소가 되어야 합니다.
(여러가지 방법 중 최소의 방법입니다.)

펼쳐두기..