'll Hacker

dreamhack wargame : Simple Crack Me writeup 본문

Hacking/Reverse Engineering

dreamhack wargame : Simple Crack Me writeup

씨이오가 되자 2024. 7. 10. 21:21
Contents
728x90

일부 운영체제나 상용 프로그램은 제품을 활성화하기 위해 시리얼 코드나 제품키를 요구하는 경우가 있음. 이용자가 제품키를 입력하면, 키가 검증되는 과정을 불법적으로 리버싱하여 우회하거나 올바른 제품키를 생성하는 행위를 크래킹이라고 부름

일반적으로 이용자로부터 어떠한 입력값을 받고 그 입력값이 정답인지 아닌지를 검증하는 프로그램.

목표는 입력값이 검증되는 과정을 리버스 엔지니어링으로 분석하여 정답이 되는 입력값을 찾아야함.

 

Step1. 프로젝트 생성 및 코드 브라우저 실행

 

Step2. 동작 구조 분석

Language ID : x86 아키텍처 64비트 명령어집합(Instruction Set)

Compiler ID : gcc로 컴파일되었음.

Executable Format을 통해 해당 파일이 Executable and Linkable Format(ELF), 즉 리눅스에서 실행가능한 바이너리임을 확인

어떤 값을 입력한 후 엔터키를 누르면 잘못되었다는 의미인 “~ is wrong x(”이라는 메시지를 출력

이것은 정수 형식의 입력을 받아딀며, 입력받은 정수를 “%x is wrong x(”와 같은 형식의 포맷 스트링으로 출력하는 프로그램으로 추론가능

정답이 아니면 “is worong x(” 출력, 정답이면 “correct” 출력

문자열 검색해보기 ▼

“is wrong x(”는 적어도 10바이트 넘음

Step3. 상호참조

빨간 네모친 부분은 프로그램 상에서 해당 문자열의 위치를 나타내는 16진수 주소값.

마우스 우측 클릭 > References > show Reference to Address (주소 참조하는 곳들을 탐색하는 기능)

 

  local_14 = 0; //local_14를 0으로 초기화
  FUN_0040bb20(&DAT_004b6004,&local_14); // scanf("%d",&local_14);
  bVar1 = local_14 != 0x13371337; //local_14의 값이 0ㅌ13371337이 아니면 1을 같으면 0을 bVar1에 대입
  if (bVar1) {
    FUN_0040b990("%x is wrong x(\\n",local_14); 
  }
  else {
    FUN_0041a400("Correct!");
  }
  if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {
                    /* WARNING: Subroutine does not return */
    FUN_0045a420();
  }

따라서 올바른 입력값은 0x13371337 이다.

16진수인 0x13371337을 10진수로 변환

→ 322376503

DH{322376503}

 

728x90

'Hacking > Reverse Engineering' 카테고리의 다른 글

dreamhack wargame Easy Assembly  (0) 2024.07.02
dreamhack : Collect Me writeup  (1) 2024.06.03
dreamhack : secure-mail writeup  (2) 2024.06.01
dreamhack : rev-basic-8 write-up  (0) 2024.06.01
dreamhack : rev-basic-6 writeup  (1) 2024.05.30