[드림핵] rev-basic-0 풀이

비얌·2022년 11월 29일
1

어셈블리 게임

목록 보기
12/15
post-thumbnail

개요

심심해서 드림핵 리버싱 워게임을 처음부터 다시 풀어보기로 했다. 아마 이전에 8~9단계까지 풀었던 것 같다.

나는 리버싱에 관련해서 아무것도 모르므로... 워게임을 뭔가 지식이 있어서 푼다기보다는 그냥 아주 조금의 단편적인 지식으로 '오 이렇게 하면 되네? 이건 안되네?' 하면서 풀 것 같다.

드림핵 리버싱 워게임 중 가장 쉬운 단계인 rev-basic-0을 풀어보자.



rev-basic-0 풀이

1. 문제

문제는 아래와 같다. correct를 출력하는 입력값을 찾으면 된다.


2. Detect It Easy 사용

Detect It Easy라는 프로그램에 넣어보면, 이 파일이 PE64 파일이고 따로 압축은 되어있지 않다고 나온다.

바로 IDA64로 열어보자.


3. IDA64 사용

(1) 전체적인 그래프 파악하기

IDA64에 해당 파일을 올려보았다. 그럼 이런 그래프가 나온다.

이 그래프만 해석해보면 어떤 input 값을 넣으면 Correct 혹은 Wrong을 출력한다는 것 같다.


(2) 디컴파일하기

F5 단축키를 눌러 디컴파일해보았다.

그럼 아래와 같은 코드가 나타난다. 해석해보면, sub_140001190 함수로 Input : 을 출력하고, sub_1400011F0 함수로 입력값을 받는 것 같다.

그리고 입력받은 값을 sub_140001000함수에 넣어보았을 때 맞으면 Correct, 틀리면 Wrong을 출력한다.

그럼 중요해보이는 sub_140001000함수를 자세히 살펴보자.

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char v4[256]; // [rsp+20h] [rbp-118h] BYREF

  memset(v4, 0, sizeof(v4));
  sub_140001190("Input : ", argv, envp);
  sub_1400011F0("%256s", v4);
  if ( (unsigned int)sub_140001000(v4) )
    puts("Correct");
  else
    puts("Wrong");
  return 0;
}

(3) sub_140001000 함수 분석하기

sub_140001000 함수를 더블클릭해서 들어가보았다.

입력받은 값을 "Compar3_the_str1ng"와 비교한다고 한다. 그럼 답이 "Compar3_the_str1ng"인 것 같다!

_BOOL8 __fastcall sub_140001000(const char *a1)
{
  return strcmp(a1, "Compar3_the_str1ng") == 0;
}


정답

Compar3_the_str1ng이 답이 맞았다!!



🐹 회고

워게임 진짜 오랜만에 풀었다..! 근데 너무 아쉬운 건.. 나는 쉬운 문제밖에 못 푸는데(왜냐하면.. 내가 너무 야매라서.. 어려운 문제는 모름) 워게임 사이트에 가면 나같은 사람이 풀 수 있는 쉬운 문제는 진짜 소량이고 어려운 문제만 가득이라는 것이다.

하지만 리버싱하는 법이나 리버싱 워게임 푸는 곳을 배울 곳은 없다.(독학하다가 포기함..^_^)

그래서 항상 아쉽다. 그래도 이렇게 쉬운 문제를 푸는 건 취미로 좋은 것 같다! 앞으로 8단계 정도까지 화이팅..!! (9단계는 이전에 몇 주간 아무리 붙잡고 풀어도 못 풀었던 기억이 있어서 그 이후로는 못풀 것 같다)

이전에 코드엔진에서 Basic 리버싱 문제를 14번까지 풀고 포스팅한 적이 있는데, 풀 수 있다면 드림핵에서 풀 수 있는 만큼 푼 후 코드엔진 문제를 이어서 풀어보려고 한다😉

아니면 Reversing.Kr에서 풀었지만 포스팅하지 않은 세 문제를 다시 풀어보고 포스팅해도 좋을 것 같다!

profile
🐹강화하고 싶은 기억을 기록하고 공유하자🐹

0개의 댓글