[드림핵] 워게임 rev-basic-8 풀이

SCY·2023년 1월 6일
0

dreamhack

목록 보기
9/12

문제

https://dreamhack.io/wargame/challenges/22/

풀이

프로그램 실행

문제 유형을 파악하기 위해 Windows의 PowerShell을 이용하여 프로그램을 실행시켜줍니다. 아래와 같이 임의의 문자열을 입력하면 'Wrong'이 출력됩니다.
이를 통해 오답 시 'Wrong', 정답 시 'Correct'가 출력됨을 예측할 수 있습니다.
image

IDA 실행

main 함수를 디컴파일합니다. (단축키 F5)

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_1400011B0("Input : ", argv, envp);
  sub_140001210("%256s", v4);
  if ( (unsigned int)sub_140001000(v4) )
    puts("Correct");
  else
    puts("Wrong");
  return 0;
}

sub_140001000 함수를 더블클릭하여 함수의 내용을 확인합니다.

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

  for ( i = 0; (unsigned __int64)i < 0x15; ++i )
  {
    if ( (unsigned __int8)(-5 * *(_BYTE *)(a1 + i)) != byte_140003000[i] )
      return 0i64;
  }
  return 1i64;
}

해결 과정

전체 탐색 알고리즘을 쓰지 않기 위해 온갖 노력을 했지만 실패.
그냥 전체 탐색 알고리즘을 사용했다. 일명 brute force 알고리즘.

nums = [0xAC, 0xF3, 0x0C, 0x25, 0xA3, 0x10, 0xB7, 0x25, 0x16, 0xC6, 0xB7, 0xBC, 0x07, 0x25, 0x02, 0xD5, 0xC6, 0x11, 0x07, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]

i = 0
res = 0
for i in range(len(nums)) :
    for res in range(255) :
        if((0xFB * res) & 0xFF == nums[i]) :
            print(chr(res), end='')
            break

8비트 제한을 걸어주기 위해 &0xFF를 적용했다.

정답

Did_y0u_brute_force?

profile
성장 중독 | 서버, 데이터, 정보 보안을 공부합니다.

0개의 댓글