[dreamhack] rev-basic-4

Monitor In Secure☃️·2024년 6월 17일

wargame_rev

목록 보기
10/11


ida로 로드하기)


디컴파일한 결과)

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

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

sub_7FF6EF741000 함수 디컴파일 결과)

__int64 __fastcall sub_7FF6EF741000(__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_7FF6EF743000[i] )
      return 0LL;
  }
  return 1LL;
}

➡️ for 반복문이 28번 반복된다.
     아래의 조건문을 만족해야 플래그 값을 알 수 있다.

(16 * (a1 + i)) | (a1 + i) >> 4)) != byte_7FF6EF743000[i]


byte_7FF6EF743000 함수)
업로드중..

exploit코드)

#include <stdio.h>

int main(void) {
  unsigned char byte_7FF6EF743000[27] = {
  0x24, 0x27, 0x13, 0xC6, 0xC6, 0x13, 0x16, 0xE6, 0x47, 0xF5, 0x26, 0x96, 0x47, 0xF5, 
  0x46, 0x27, 0x13, 0x26, 0x26, 0xC6, 0x56, 0x0F5, 0xC3, 0xC3, 0xF5, 0xE3, 0xE3 };
  
  for(int i = 0; i < 27; ++i) {
    printf("%c", (byte_7FF6EF743000[i]*16) | (byte_7FF6EF743000[i] >> 4));
  }
  printf("\n");
}

업로드중..

플래그값이 출력된다.

0개의 댓글