Screenshot 2024-06-24 at 4.24.41 PM.png

main 함수를 디컴파일 했을 때 위와 같은 코드가 나옵니다.

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

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

위 코드는 sub_140001000 함수를 디컴파일한 값입니다.

Logic을 보면 input[i]+input[i+1]이 byte[i]가 되야합니다.

문자열은 마지막 byte가 \00이므로 값을 리버스하여 byte값을 알아냅니다.

byte_140003000 = [0xAD, 0xD8, 0xCB, 0xCB, 0x9D, 0x97, 0xCB, 0xC4, 0x92, 0xA1, 0xD2, 0xD7, 0xD2, 0xD6, 0xA8, 0xA5, 0xDC, 0xC7, 0xAD, 0xA3, 0xA1, 0x98, 0x4C]

flag = [0] * 25
for i in range(len(byte_140003000) - 1, -1, -1):
    difference = byte_140003000[i] - flag[i + 1]
    flag[i] = difference & 0xFF

print(''.join(map(chr, flag[:-1])))