Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

CIDY

[Reverse_Engineering] 문제풀이(patch) 본문

Hack/DreamHack

[Reverse_Engineering] 문제풀이(patch)

CIDY 2022. 7. 17. 00:36

 

실행시키면 이런걸 보여준다.

 

이름처럼 문제 프로그램을 패치해서 해결하라는 것 같다. 선을 그리는 부분을 찾아 제거해야 할듯..

 

프로그램이 DLL에서 임포트해 사용하는 함수 목록은 import에서 볼 수 있다.

 

CreateWindowExW 가 윈도우를 생성할 때 사용되는 함수 이름인데, 얘가 임포트되는 곳으로 가보자.

 

 

winmain에서 참조되고 있다.

 

 

 

winmain을 디컴파일한거 14번째 줄을 보면 윈도우의 메시지 콜백을 설정하는 부분이 있다. (메시지 콜백함수에 윈도우 동작이 정의되어 있다.) -> 저 서브함수를 뜯어보자.

 

LRESULT __fastcall sub_1400032F0(HWND a1, UINT a2, WPARAM a3, LPARAM a4)
{
  _QWORD *v5; // rbx
  __int64 v6; // rbx
  __int64 v7; // [rsp+20h] [rbp-18h] BYREF

  switch ( a2 )
  {
    case 2u:
      PostQuitMessage(0);
      return 0i64;
    case 0xFu:
      qword_140007910 = (__int64)BeginPaint(hWnd, &Paint);
      v5 = (_QWORD *)GdipAlloc(16i64);
      if ( v5 )
      {
        *v5 = 0i64;
        v5[1] = 0i64;
        v7 = 0i64;
        *((_DWORD *)v5 + 2) = GdipCreateFromHDC(qword_140007910, &v7);
        *v5 = v7;
      }
      else
      {
        v5 = 0i64;
      }
      qword_140007918 = (__int64)v5;
      sub_140002C40();
      v6 = qword_140007918;
      if ( qword_140007918 )
      {
        GdipDeleteGraphics(*(_QWORD *)qword_140007918);
        GdipFree(v6);
      }
      EndPaint(hWnd, &Paint);
      return 0i64;
    case 0x202u:
      InvalidateRect(hWnd, 0i64, 1);
      UpdateWindow(hWnd);
      return 0i64;
    default:
      return DefWindowProcW(a1, a2, a3, a4);
  }
}

 

디컴파일해보면 이러하다. 저 beginpaint가 문제인 것 같은데, beginpaint와 endpaint사이에서 플래그를 출력해줄것이기에 저 가운데 있는 함수를 뜯어보자.

 

 

계속 같은 함수를 호출한다. 저게뭐야....

 

 

펜을 불러서 뭘 그린다...

 

 

그 다음 함수는 펜을 여러 번 불러서 그린다.

 

 

위에서 본 함수에 브레이크 포인트를 걸고 한줄씩 실행시켜보니까 이렇게 선을 하나씩 막 그린다.

 

그럼 쟤네를 패치해야 하는데, 

 

 

패치하자~

 

 

선을 그리는 함수가 시작하자마자 ret해버리도록 패치하면 된다.

 

 

어쩌다 너무 많이 깔았는데, 어차피 한번 ret하면 뒤에건 실행 안 할 거니까