NOT4DOG
방명록 RSS 태그 글쓰기 관리자
 
[CTF] Dreamhack rev-basic-4 문제 Write-up
CTF Write-up 2022-01-10 13:25:09

반응형

문제) Reversing Basic Challenge #4

          이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여

          correct 또는 wrong을 출력하는 프로그램이 주어집니다.

          해당 바이너리를 분석하여 correct를 출력하는 입력값을 알아내세요.

          획득한 입력값은 DH{} 포맷에 넣어서 인증해주세요.

          예시) 입력 값이 Apple_Banana일 경우 flag는 DH{Apple_Banana}

 

문제와 같이 chall4.exe 파일을 제공한다.

이전 rev-basic 문제들과 비슷하기에 ida를 이용해서 로직을 먼저 확인했다.

이번에도 동일하게 sub_140001000 함수에서 비교가 이루어지는것을 확인할 수 있다.

sub_140001000 함수에서 비교가 일어난다

이번에는 sub_140001000 함수의 Pseudo code를 확인하였다.

sub_140001000 Pseudo code

__int64 __fastcall sub_140001000(__int64 a1)
{
  int i; // [rsp+0h] [rbp-18h]

  for ( i = 0; (unsigned __int64)i < 0x1C; ++i )
  {
    if ( ((unsigned __int8)(16 * *(_BYTE *)(a1 + i)) | ((int)*(unsigned __int8 *)(a1 + i) >> 4)) != byte_140003000[i] )
      return 0i64;
  }
  return 1i64;
}

코드를 대략적으로 분석해보니 Left Shift, 자릿수 소거 등을 이용해서

최종적으로 hex값의 앞뒤가 바뀌는것을 확인할 수 있다.

만약 0010 1100 이 입력으로 들어가면 출력으로 1100 0010이 나온다.

이를 토대로 a1 배열값을 찾아 위 알고리즘에 맞게 변환해주면 FLAG를 얻을 수 있다.

 

a1 배열의 값이 있는곳은 위에 sub_140001000 함수에서 확인할 수 있다.

byte_140003000[i] 에 있는 값을 참조하므로 Hex View에서 해당 위치를 조회해 보았다.

a1 배열의 Hex Value

그렇다면 a1 배열의 값은

{ 24 27 13 C6 C6 13 16 E6 47 F5 26 96 47 F5 46 27
13 26 26 C6 56 F5 C3 C3 F5 E3 E3 } 임을 확인할 수 있다.

 

나는 16진수값을 텍스트로 변환해주는 사이트를 이용했다.

물론 위 sub_140001000 알고리즘을 기반으로 c언어나 python을 사용해 작성해도 된다.

 

FLAG 획득

여기서 주의해야할 점은 위 알고리즘에 따라 (XXXX YYYY → YYYY XXXX)

a1 배열 16진수 값의 앞, 뒤를 서로 바꿔 변환해주어야 한다. 

이 점에 유의해서 변환하니 FLAG를 얻을 수 있었다.

반응형