본문 바로가기

Computer Security/CTF

[Ahnlab wave 2012] network 난이도 middle 풀이

문제:

m.pcap



사실 전 대회 끝날때까지 못풀어서 정확한 답은 모르지만

그래도 제가 한 내용을 한번 올려봅니다

 

이번 대회에서 주어진 m.pcap 파일을 와이어샤크로 열어보면

 

메일을 3번 주고 받은것을 알수있습니다

 

그리고 그것들은 base64 인코딩으로 되어있는데

base64인코딩, 게다가 짧은 텍스트파일은 그냥 네이버에 "base64 디코딩 사이트" 대충 이런걸 쳐서

들어가셔서 디코딩 하시면 아래와 같은 내용이 나옵니다

 

첫번째 메일은

 

3d 반도체 기술 자료 송부 드립니

안녕하세요.
강병규입니다.

말씀하신 내용 조사해서 회신 드립니다.

감사합니다.

강병규 드림.

 

첨부파일: 어떤 텍스트파일

대충 이런 내용이었고

 

두번째 메일은

 

 안녕하세요.
 진영인입니다.

 이번 휴가 중에 하루 시간이 괜찮아서 같이 수영장에 가요...
 장소를 잘 생각해서 메일 한번 다시 드릴께요.

 그럼..

 

세번째 메일은

 

거기서 뵙는 걸로

 안녕하세요.
 진영인입니다.

 휴가 같이 보내실 수 있으신가요?? ㅎ
 요즘에 이분이 대세더라구요.....
 저도 옷핀이나 주렁주렁 달고 다닐까 하네요 ㅋㅋ

 그럼, 나중에 그곳(?)에서 뵙는 걸로~~

 

첨부파일: oppinstyle.jpg 

 

 

이었습니다.

 

첫번째 메일은 agang과 주고받은 메일이 아니기때문에 무시하고

 

2,3 세번째 메일만 봤을때 중간에 뭔가 사라져서 트위터나 다른걸로 연락한줄 알고 거기만 뒤졌었는데 ....;;;;;;;;;;

결국 그게 아니더군요

 

그리고 힌트가 올라왔습니다. 힌트내용은 "ID3"

ID3는 mp3의 태그입니다.

그리고 전 네트워크 low문제도 대회 끝나고나서 풀었는데, 로우문제를 풀었다면 스태가노그래피 또한 힌트가 될수 있겠죠

 

결국................... oppinstyle.jpg 안에 어떤 mp3 파일이 스태가노그래피로 숨겨져있던 것이었습니다.........

 

우선 oppinstyle.jpg를 받고, base64 디코딩을 합니다.

이 과정에서 좀 헤맸는데

base64 디코딩은 돌아다니는 디코딩 소스를 조금 수정해서 했구요

 

소스는 이렇습니다.

 

#include <stdio.h>
#include <stdlib.h>
#include <string>

static int DecodeMimeBase64[256] = {
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 00-0F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 10-1F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,  /* 20-2F */
    52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,  /* 30-3F */
    -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,  /* 40-4F */
    15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,  /* 50-5F */
    -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,  /* 60-6F */
    41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1,  /* 70-7F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 80-8F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 90-9F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* A0-AF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* B0-BF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* C0-CF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* D0-DF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* E0-EF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1   /* F0-FF */
};

typedef union{
    struct{
        unsigned char c1,c2,c3;
    };
    struct{
        unsigned int e1:6,e2:6,e3:6,e4:6;
    };
} BF;

void base64d(FILE *fp, FILE *result, int *length){
    int i = 0, src_length, blank = 0;
    BF temp;

    src_length = *length;

    while( ++(++(++(++i))) < src_length + 1){
        fseek(fp , i-4 , SEEK_SET);
        temp.e4 = DecodeMimeBase64[getc(fp)];
        fseek(fp , i-3 , SEEK_SET);
        temp.e3 = DecodeMimeBase64[getc(fp)];
        fseek(fp , i-2 , SEEK_SET);
        char c_get = getc(fp);
        if(c_get == '=')
            temp.e2 = 0x00;
        else temp.e2 = DecodeMimeBase64[c_get];
        fseek(fp , i-1 , SEEK_SET);
        char c_get2 = getc(fp);
        if(c_get2 == '=')
            temp.e1 = 0x00;
        else temp.e1 = DecodeMimeBase64[c_get2];

        putc(temp.c3, result);
        putc(temp.c2, result);
        putc(temp.c1, result);
    }
}

int main(void){
    FILE *fp;
    FILE *result;
    int src_size;
   
    fp = fopen("input.txt", "rt");
    fseek(fp , 0L , SEEK_END);
    src_size = ftell(fp);
    result = fopen("result2", "wb");
    base64d(fp,result,&src_size);
    fclose(result);
    fclose(fp);

 

어찌됐든 디코딩을 하고나면 장동건이 나오는 jpg 그림이 나오는데

 

헥사에디터로 열어서 ID3를 검색하면 그 ID3부터 뒤쪽이 쭉 mp3 파일입니다.

 

그부분만 추출해서 뽑아내면 mp3파일이 만들어지는데

 

그 mp3 파일을 실행시키면 뚜뚜뚜 뚜~ 뚜~

 

이런 소리가 들립니다.. 즉 모스부호

 

모스부호를 해석하면

 

37.53480,126.993900

 

위도 경도를 조사해보니, 해밀턴 호텔이 나오네요

 

수영장인줄 알았더니.............

 

해밀턴호텔이 맞는지는 확인을 못했습니다.. 제가 대회시간안에 못풀어서