본문 바로가기

SWUFORCE 워게임👊🏻

[Dreamhack] Beginner ; rev ; simple-operation

<드림핵_비기너_리버싱_simple-operation>

 

 

 

1. 서버 생성

 

2. 다운받은 문제 파일은 chall, flag 파일 두 개

3. 아이다로 코드 확인

 

<코드 분석>

  char s1[9]; // 변환된 결과 저장
  char s[9];  // XOR 연산 후 16진수로 변환된 값 저장
  int v6, v7; // v6: 랜덤 숫자, v7: 사용자 입력 값
  char *s2;   // 비교할 문자열
  int fd;     // 파일 디스크립터
  void *buf;  // 파일에서 읽어온 데이터 저장
  int v11, i; // v11: v6 XOR v7 저장, i: 루프 변수

  v7 = 0;
  v6 = 0;
  v11 = 0;
  get_rand_num(&v6); // v6에 난수 저장
  printf("Random number: %#x\n", v6);
  printf("Input? ");
  __isoc99_scanf("%d", &v7);
  • get_rand_num(&v6): v6에 랜덤 숫자 저장
  • 랜덤 숫자를 16진수(%#x)로 출력
  • 사용자 입력을 받아 v7에 저장
  v11 = v6 ^ v7;
  snprintf(s, 9u, "%08x", v6 ^ v7);
  • v6과 v7을 XOR 연산하여 v11에 저장
  • snprintf()를 이용해 16진수 형식("%08x")으로 s에 저장 (8자리 16진수 문자열)
  for ( i = 0; i <= 7; ++i )
    s1[i] = s[7 - i];
  • s의 문자열을 뒤집어 s1에 저장
  • s1에는 s의 역순이 저장됨
  s2 = "a0b4c1d7";
  if ( !strcmp(s1, "a0b4c1d7") )
  {
    puts("Congrats!");
    puts((const char *)buf);
  }
  else
  {
    puts("Try again");
  }

 

  • s1과 "a0b4c1d7" 비교
  • 같으면 "Congrats!"와 함께 buf(파일 내용) 출력
  • 다르면 "Try again" 출력

=>

  1. 프로그램은 난수를 생성(v6)하고, 사용자 입력(v7)을 받음.
  2. v6과 v7을 XOR 연산한 결과를 16진수로 변환하여 s에 저장.
  3. s를 뒤집어 s1에 저장.
  4. s1이 "a0b4c1d7"와 일치하면 "Congrats!"와 함께 "./flag" 파일 내용을 출력.
  5. 다르면 "Try again" 출력.

즉, 이 프로그램은 XOR 연산을 활용한 간단한 난수 기반 패스코드 확인 방식이다.

v6 ^ v7의 16진수 결과가 "d7c1b4a0"(역순 저장된 "a0b4c1d7")가 되어야 통과할 수 있다.

 

4. input 계산하는 코드 작성

 

5. nc 접속하여 플래그 얻음

 

 

해결 완!! 👊🏻