티스토리 뷰

이 포스트는 2017년 1월에 작성된 글입니다.

안녕하세요. 플레이팅 개발자 이벤트 '이상한 나라의 스트링' 문제 출제자이자 플레이팅의 백엔드 개발자 요우입니다. 개발자 이벤트#1. 이상한 나라의 스트링 나름 폭발적인 관심을 받았는데요 :) 정말 많은 분들이 이벤트에 참여해주셨습니다.

 

참여 해주신 모든 분들께 감사를 드립니다 ㅜㅜ

문제 해설

문제 페이지: https://goo.gl/BOi9Vb

MDQ3IDA0MiA...중간생략...IDAxMyAwMTA=

첫 문제 링크인 https://goo.gl/BOi9Vb 은 모두들 눈치 채셨겠지만 Base64로 Encode된 문자열이었습니다..! 이 문자열이 Base64로 인코딩 되었다는 힌트를 주기 위해 문자열 끝에 = 을 붙이기 위해 여러번의 시도가 있었습니다..! 문자열 끝의 =은 Base64의 특징이죠..! Base64로 인코딩된 문자열은 https://www.base64decode.org/ 와 같은 온라인 툴을 사용해서 쉽게 Decode할 수 있습니다. 위의 Base64 문자열을 디코딩 하면..!

047 042 032 087 ..중간생략.. 042 047 013 010

위와 같은 또 다른 해괴한 문자열이 나타나게 됩니다. 제가 문제를 너무 많이 꼬았을 까요..? 047.. 042.. 087... 조금만 생각해보시면 이 문자열 역시 ASCII 포맷인 것을 알 수 있습니다. 마찬가지로 http://www.unit-conversion.info/texttools/ascii/ 와 같은 온라인 툴을 사용하시어 Decode를 하시면..!

/* Welcome ..! You Know Base64 and ASCII ..! Are You Ready Next Level? */
main(){int fogOfMap[]={0x6D6F7320,0x69687465,0x6220676E,0x656B6F72,0x67202E6E,0x756C206F,0x20796B63,0x73657246,0x68542068,0x696B6E69,0x5220676E,0x74686769,0x6F6F6620,0x6E752064,0x65757169,0x70586520,0x65697265,0x2F65636E};/*char *getOutFog=??*/char blackSheepWall[]={19,20,20,17,19,22,71,28,34,43,49,54,62,0};}
/* Problem by http://fb.com/luckyyowu */

드디어 뭔가 소스코드 같은 것이 나왔습니다..! 사실 제가 처음 의도했던 메인 문제가 이 소스코드였는데요. 이 것을 좀 더 보기 좋게 바꾸면..

int main(void) {
  int fogOfMap[]={0x6D6F7320,0x69687465,0x6220676E,0x656B6F72,0x67202E6E,0x756C206F,0x20796B63,0x73657246,0x68542068,0x696B6E69,0x5220676E,0x74686769,0x6F6F6620,0x6E752064,0x65757169,0x70586520,0x65697265,0x2F65636E};
  /*char *getOutFog=??*/
  char blackSheepWall[]={19,20,20,17,19,22,71,28,34,43,49,54,62,0};
  return 0;
}

fogOfMap 변수는 'something broken. go lucky Fresh Thinking Right food unique eXperience/' 문자열을 Little-endian 방식으로 4 Byte씩 Integer 변수에 Hex값을 저장해 둔 것입니다. 그리고 blackSheepWall은 fogOfMap을 1 Byte 배열로 치환했을 때 정답에 해당하는 Index Number를 매핑해둔 것이었습니다. 이 문제를 해결하신 참 다양한 문제 풀이법을 발견했는데요. 제가 의도한 풀이법은 다음과 같습니다.

int main(void) {
  int fogOfMap[]={0x6D6F7320,0x69687465,0x6220676E,0x656B6F72,0x67202E6E,0x756C206F,0x20796B63,0x73657246,0x68542068,0x696B6E69,0x5220676E,0x74686769,0x6F6F6620,0x6E752064,0x65757169,0x70586520,0x65697265,0x2F65636E};
  char blackSheepWall[]={19,20,20,17,19,22,71,28,34,43,49,54,62,0};
  char *getOutFog=fogOfMap;
  for(int i=0; i<strlen(blackSheepWall); i++{
    printf("%c", getOutFog[blackSheepWall[i]]); // --> output : goo.gl/FTRfuX
  }
  return 0;
}

위 소스코드를 보시면 눈치 채셨겠지만 사실 getOutFog 변수는 약간의 힌트를 소스 코드내에 남겨둔 것이었습니다. C언어 포인터의 특성을 사용하여 fogOfMap을 마치 String처럼 다루었습니다. 여러 문제풀이를 받았었는데 fogOfMap을 Byte 단위로 변환하고 1/4 하여 답을 도출하는 것에는 정말 감탄했습니다.. fogOfMap과 blackSheepWall을 매핑하여 도출되는 답은 https://goo.gl/FTRfuX 입니다. 해당 URL로 접속을 하게되면..!

(이 페이지에 대한 일화를 잠시 풀어보자면 원래 여기가 최종 정답 페이지가 맞았습니다. 그런데 이벤트 전날 몇몇 그룹에 문제 검수를 요청했고, 그 과정에 문제가 유출되어 불가피하게 문제를 한번 더 꼬아버리게 된것입니다. 흑흑)

페이지를 보면 뭔가 해킹 당한 듯한 흔적이 있고, 손상된 QR 코드가 보입니다. 의외로 '정말 해킹당한 것이 아니냐?'라는 질문을 많이 받았는데요. 절대 그런 것이 아니고 출제자의 의도였습니다. 브라우저의 개발자 도구를 사용하여 해당 페이지의 소스 코드를 확인하면 다음과 같은 소스 코드가 확인됩니다.

<h1>Con■■■tu■ati■■ ■!</h1>
<p>안녕하세요. 이번 문제■■■■한 플레■■■■■드 개발■■■■우입니다.</p>
<p>여■■■■■■■■■■■■■■ 해■■■■■■■■■■■■■■■■■■다.</p>
<p style="color:red;"><b>Hacked !! kkkkk</b></p>
<img src="cmVhbF9hbnN3ZXJfUVJfY29kZS5wbmc="/>

뭔가 눈치채셨나요? 태그를 보시면 첫번째 단계와 마찬가지로 src 속성의 값이 Base64로 인코딩 되어 있습니다. 정말 허술하군요. 해당 값을 Decode 하면 real_answer_QR_code.png 라는 문자열이 나타나고 개발자 도구에서 이를 치환하면 원본 QR코드를 확인할 수 있습니다.

이 부분에서 크게 어려워하실 분들이 없으실 줄 알았는데 의외로 헤매신 분들이 많았다고 합니다..ㅜㅜ (어떤 분은 포토샵으로 QR 코드 복구를 시도하셨다고..!) 위 QR코드를 휴대폰의 QR 코드 리더기나 QR 코드 리더 온라인 툴을 사용하시면 드디어 정답 페이지가 나타납니다.

이번 개발자 이벤트#1. 이상한 나라의 스트링의 Promotion Key는 NoStringsOnMe 였습니다..! (이제 이 키는 사용하실 수 없어요 ㅜㅜ. NoStringsOnMe는 어벤져스2 에이지 오브 울트론에서 울트론의 명대사 입니다..!)

마무리

약 1,200명이 문제 페이지에 접속을 하셨었고, 최종 정답 페이지까지 도달하신 분은 122명입니다. 약 10%로 문제를 푸셨네요. 개발자 이벤트 첫번째 부터 너무 어려운 문제를 낸 것이 아니었나 싶습니다. 죄송합니ㄷ..

조만간 업로드 되는 플레이팅 개발자 Jude의 개발자 이벤트#2. 피노키오 문제도 많은 관심 부탁드립니다!

그리고 개발자 이벤트 #2는 거짓말 처럼 묻혀버렸다고 한다...

저작자 표시 비영리 변경 금지
신고
프로필사진

Yowu (Yu Yongwoo)

My MBTI type is ENTP. (Of course I do not believe it 100%, but I want to do that) I use Node.js to develop the backend. I use Ubuntu Linux as my development environment, and I love Vim. I am interested in open source and are keen to contribute. I have a bachelor's degree in computer science from Catholic University and now a software engineer at Plating Inc., I spent about 5 years developing and learning, and I am still interested in software development and culture. Recently, I am interested in React, Serverless structure, Domain Design Driven. Sometimes I play drums in the band.