안경잡이개발자

728x90
반응형

wargame.kr - EASY_CrackMe 문제풀이(Write Up)

문제 분류: 리버싱(Reversing)

 

  이번 시간에 풀어 볼 문제는 대표적인 워게임(Wargame) 사이트인 wargame.kr에서 제공하는 간단한 리버싱(Reversing) 문제입니다. 문제 이름은 EASY_CrackMe입니다.

 

  ▶ 문제풀이 사이트 주소: http://wargame.kr

 

Wargame.kr - 2.1

https://www.facebook.com/wargame.kr

wargame.kr

 

  바로 문제풀이 사이트에서 [EASY_CrackMe] 문제를 선택해서 풀어보겠습니다.

 

 

  [Start] 버튼을 눌러서 프로그램 파일을 확인합시다.

 

 

  파일을 다운로드 하여 실행을 해보겠습니다.

 

 

  실행을 하면, 단순히 무언가를 입력하여 제출하는 창이 나옵니다.

 

 

  일단 아무 텍스트나 입력한뒤에 [check] 버튼을 누르면, 다음과 같이 틀렸다는 내용이 등장합니다. 확인 결과 문자열은 nono.. 인 것으로 판단됩니다.

 

 

  이제 IDA Pro 32bit을 실행하여 해당 CrackMe1st.exe 파일을 분석해보도록 하겠습니다.

 

 

  처음 IDA Pro로 프로그램을 불러오면, 위와 같이 프로그램의 크기가 작지 않기 때문에 로딩에 있어서 약간의 시간이 소요됩니다. 일단 가장 먼저 [Quick View(Ctrl + F1)]을 실행하여 [Names View]를 확인합니다.

 

 

  이후에 찾고자 하는 문자열인 "nono"를 검색하여 더블 클릭 합니다.

 

 

  그러면 다음과 같이 텍스트 부분이 나옵니다.

 

 

  이제 마우스 우클릭을 한 뒤에 [List cross references to...] 버튼을 눌러서 이를 참조하는 코드를 확인합니다.

 

 

  그러면 다음과 같이 함수 내용이 나옵니다.

 

 

  이제 함수가 등장했으므로, [F5]를 눌러서 Hex-Ray를 동작시킵니다.

 


  그러면 다음과 같이 Hex-Ray로 내용을 살펴 볼 수 있습니다. 보시면 "G00d!"라고 출력되는 부분이, 바로 정답 처리를 부분이라고 판단할 수 있습니다. 또한 서버와 통신하는 부분이 들어가 있습니다. 즉, 정답을 서버로 제출하게 되고 서버가 실질적인 Flag 값을 주는 것으로 파악할 수 있습니다.

 

 

  소스코드를 확인해 보시면 다음과 같이 분석할 수 있습니다.

 

  - v1[30]: 사용자가 입력한 문자열

  - v4: 문자열의 길이

  - wcsstr(A, B): A 문자열에 B 문자열이 포함되어 있는지 확인합니다.

  - wtoi(A): A 문자열을 정수 형태로 변경합니다.

 

  따라서 소스코드의 내용을 다음과 같이 정리할 수 있습니다.

 

  문자열의 길이가 정확히 13글자이면서, 문자열에 _my_b와 birth가 포함됩니다. 그와 동시에 문자열이 1114로 시작해야 합니다. 왜냐하면 wtoi() 함수는 앞에서부터 출발하여 숫자가 아닌 문자를 만났을 때, 거기서부터는 수로 변경하지 않기 때문입니다.

 

  이러한 조건을 만족하는 문자열은 1114_my_birth입니다.

 

 

  따라서 해당 정답을 제출하면, Flag 값을 받을 수 있습니다.

 

 

  혹은 서버의 API 주소에 바로 정답 데이터를 보내도 Flag를 얻을 수 있었습니다.

728x90
반응형

Comment +1

  • Karatus 2020.04.21 19:30

    안녕하세요. 문제풀이 잘 봤습니다.
    하지만 하나 궁금한 점이 저 같은 경우에는 함수명이 제대로 표시되지 않는 문제점이 있었습니다.
    우여곡절 끝에 겨우 풀었지만 후에 이 풀이를 참고해 정적, 동적 툴을 이용한 모든 분석에서 여전히 해당 문제가 남아있었습니다.
    그래서 해당 함수가 정의되어 있는 dll 파일을 찾아 넣어주기도 했지만 결과는 같았습니다.
    혹시 어떻게 해야 해결할 수 있는지 아신다면 알려줄 수 있으신지 여쭤보고 싶습니다.
    감사합니다.