0x90 NOP!

Patch 기법을 사용하는 문제이다.

ida에 main.exe를 넣고 ok, yes를 누른다.(아무 것도 건드리면 안됨)

그 후 f5로 디컴파일(C 코드 보기)를 할 수 있는데 그러면 아주 노골적인 이름의 patchme 함수를 발견 할 수 있다.

더블 클릭 후 들어가서 tab을 눌러 다시 어셈블리 언어를 본다.

call sleep에 커서를 두고, Edit > Patch program > Assemble을 클릭.

함수가 하나로 연결될 때까지 5번 nop을 입력 후 ok를 누르면 된다.

그 후 Edit > Patch program > Apply patches to input file…을 누르면 끝!

플래그: DIMI{NOPpatch_is_also_important}

image.png

99XorOfCode

main 함수를 보자.

__int64 __fastcall main(int a1, char **a2, char **a3)
{
  int v3; // edx
  char *v4; // rax
  __int64 i; // rax
  const char *v6; // rdi
  char v8[58]; // [rsp+8h] [rbp-90h] BYREF
  char v9; // [rsp+42h] [rbp-56h] BYREF
  unsigned __int64 v10; // [rsp+88h] [rbp-10h]

  v10 = __readfsqword(0x28u);
  __isoc99_scanf("%59s", v8);
  v3 = 99;
  do
  {
    v4 = v8;
    do
    {
      *v4 ^= v4[1];
      ++v4;
    }
    while ( v4 != &v9 );
    --v3;
  }
  while ( v3 );
  for ( i = 0LL; i != 58; ++i )
  {
    if ( byte_4020[i] != v8[i] )
    {
      v6 = "No";
      goto LABEL_10;
    }
  }
  v6 = "That's Flag";
LABEL_10:
  puts(v6);
  return 0LL;
}

루틴은 아래와 같음.

포인터에 대한 이해가 좀 필요한 문제이다.

v8은 input이다.