본문 바로가기

드림핵 워게임

[드림핵/워게임] rev-basic-0

https://dreamhack.io/wargame/challenges/14/

 

문제 파일을 받으면 이렇게 실행 파일이 존재한다.

 

터미널에서 실행해 보면

 

 

사용자의 입력을 받고 Wrong을 출력하는 걸 볼 수 있다.

IDA로 열어 보자!!

 

 

강의를 보긴 했지만 처음 해 보는 거라 막막하기만 하다…

 

 

우선 사용자의 입력으로 인해 correct, wrong 이 결정되고 출력되므로 단축키 Shift + F12를 사용해 correct 문자열을 찾아 보자!!

 

Ctrl+F를 통해 correct를 찾아 주고 더블 클릭해 주면 아래와 같은 화면이 뜬다.

 

View → Open Subviews → Cross References 를 누르면 이 문자열이 참조되는 함수를 볼 수 있다. 사실상 위의 사진에서도 correct는 main+57에서 쓰인다는 것을 알 수 있다.

 

Functions에서 main을 누르고 f5를 통해 디컴파일해 보자

 

 

디컴파일된 main 함수이다.

sub_14001190함수를 두번 클릭하면

 

 

디컴파일된 sub_14001190 함수를 볼 수 있다.

va_start() → 가변 인자 처리

__arct_iob_func() → 스트림을 가져옴

  • 인자로 들어오는 1은 stdout을 의미

 

따라서 sub_14001190함수는 문자열 인자를 받고 stdout 스트림을 내부적으로 사용하는 가변 함수인 printf 함수라고 추정할 수 있다.

 

 

다음은 sub_140011F0 함수이다. 위의 함수와 똑같은 va_start()를 통해 가변 인자를 받는다. __acrt_iob_func() 함수의 인자가 0으로 stdin 스트림을 가져온다. 따라서 이 함수는 scanf 라고 추측할 수 있다.

 

 

마지막으로 sub_140001000 함수이다. 인자로 받은 값과 “Compar3_the_str1ng을 비교해 같으면 1을, 다르면 0을 반환한다. 이 함수는 Compare 함수라고 이름을 바꿔 주겠다.

 

 

분석된 전체 코드는 이러하다.

  1. printf() 함수를 통해 Input: 을 출력한다.
  2. scanf() 함수를 통해 입력을 받는다.
  3. 이 입력값을 Compare 함수의 인자로 넣어 “Compar3_the_str1ng”과 비교한다.
  4. 둘이 같으면 Correct, 다르면 Wrong을 출력한 후 종료한다.

 

따라서 플래그는 DH{Compar3_the_str1ng} 이라는 것을 알 수 있다.