Search Results for '기타/WriteUp'

1 POSTS

  1. 2013.03.08 Codegate 2013 bin 200 write up ...?

Codegate 2013 bin 200 write up ...?

Posted 2013. 3. 8. 21:07

문제에 딱히 설명은 없었다.

 

파일을 받고 열어보면 실행이 제대로 되지 않을 때가 있는데 관리자 권한으로 실행시켜야 한다.

 

실행하면 드라이버 이름을 입력하라고 나온다,,

 

 

 

하지만 아무거나 입력해도 딱히 변하는 값은 없고 맨 마지막에 나오는 Message 값만 다르게 나온다.

 

 

 

그리고 중간에 보면 위와 같은 내용이 보이는데 이 값을 Base64 디코딩 하면 뭔가 나올 것 같아서 해봤는데 안됬다.

 

올리디버거로 메인부터 살펴보면

 

 

이런 부분을 발견할 수 있다.

 

이때 부터 두근두근 하면서 혹시 ????를 바뀌는 부분이 있을까,,하고 찾아봤는데 못찾겠다;;;;

 

그래서 이번에는 입력값에 따라 달라지는 Message 값을 추적해 봤다.

 

 

 

 

먼저 입력 값을 compress 해준다.

 

그 다음에 base64? 는 아니지만 뭔가 비슷한 걸로 인코딩 한 뒤에 출력한다.

 

다시 그 함수를 들어가면........ 잘 모르겠다....

 

그래서 그냥 한번 쭈~~~욱 훑어보던중

 

 

이런 부분이 있었는데 마치 Base64 에서 보던것과 뭔가 비슷해 보였다,,,

 

(아래가 Base64의 인코딩 테이블이다..)

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

 

따라서 루틴은 아래와 같다.

 

입력값 -> compress -> Base 인코딩

 

그래서 인코딩 테이블을 바꾼뒤 Base 디코딩을 한 뒤에 zlib를 사용해서 uncompress() 해주면 Key 가 나온다.

 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "..\..\zlib127\zlib-1.2.7\zlib.h"

//변환할 문자열
char str[] = "8pFHHoMssjtoucpX4EdPgcrdzuKXgEFV7iNur4YzDrOdfyNOA/bp7lX=";

//Base64 테이블
char table[]="QwErTyUiOpAsDfGhJkLzXcVbNm0246813579qWeRtYuIoPaSdFgHjKlZxCvBnM+/";


int find_index(char a);      // base64 인덱스 찾아줌
void dec2bin(char *src, int a, int pos); // 10진수를 2진수로 (pos는 반환할 자리수)
int bin2dec(char *a);      // 2진수 문자열을 10진수로 반환

int main()
{
 int i, j = 0, index;
 char bin[1000] = {0,}, tmp[10];
 Bytef compressed_str[1000], uncompressed_str[1000];
 uLongf len = 1000;

 //Base64 -> bin  base 인코딩을 6자리 2진수 나열로 변환
 for(i = 0; str[i] != '\0' && str[i] != '='; i++)
 {
  index = find_index(str[i]); //base64테이블에서 index 찾아옴
  dec2bin(tmp, index, 6);  //2진수를 6글짜로 리턴
  strcat(bin, tmp); 
 }

 //bin -> char 나열된 2진수를 8자리 단위로 분리하여 변환
 for(i = 0; i < strlen(bin); i += 8)
 {
  memset(tmp,0,10);
  memcpy(tmp, bin+i, 8);
  compressed_str[j++] = bin2dec(tmp);
 }
 compressed_str[j] = '\0';

 //uncompress
 uncompress(uncompressed_str,&len, compressed_str,1000);
 
 //print
 printf("%s\n", uncompressed_str);
 return 0;
}

int find_index(char a)
{
 int i;
 for(i = 0; i < 64; i++)
 {
  if(table[i] == a)
   return i;
 }
 printf("error\n");
 exit(1);
}
void dec2bin(char *src, int a, int pos)
{
 int i, k = 1;
 
 for(i = 0; i < pos-1; i++, k*=2); 

 for(i = 0; i < pos; i++,k /= 2)
 {
  if(a & k)
   src[i] = '1';
  else
   src[i] = '0';
 }
 src[i] = '\0';
}
int bin2dec(char *a)
{
 int i, k = 1, result = 0;

 for(i = strlen(a)-1; i >= 0 ;i--, k*=2)
 {
  if(a[i] == '1')
   result += 1*k;
 }
 return result;
}

 

http://zlib.net/zlib127.zip 

 

위 링크에서 zlib를 받으면 많은 .h 파일과 .c 파일이 있을 것이다.

거기서 모든 .h 파일과 .c 파일을 프로젝트에 포함시킨 다음에 zlib.h 의 위치를 찾아서 include 시켜주면 uncompress 를 사용가능하다.

 

아래 첨부파일은 Visual Studio 2012 로 만든 프로젝트다..

 

ConsoleApplication2.7z

 

(zip은 용량이 10MB가 넘는데 7z 5MB 라니..)

 

허접한 write up ㅈㅅ