CIDY
[Reverse_Engineering] 문제풀이(patch) 본문
실행시키면 이런걸 보여준다.
이름처럼 문제 프로그램을 패치해서 해결하라는 것 같다. 선을 그리는 부분을 찾아 제거해야 할듯..
프로그램이 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하면 뒤에건 실행 안 할 거니까
'Hack > DreamHack' 카테고리의 다른 글
[System_Hacking] 문제풀이(environ) (0) | 2022.07.17 |
---|---|
[Reverse_Engineering] 문제풀이(rev-basic-3) (0) | 2022.07.17 |
[Reverse_Engineering] 문제풀이(rev-basic-1) (0) | 2022.07.16 |
[Reverse_Engineering] 문제풀이(rev-basic-0) (0) | 2022.07.16 |
[System_Hacking] 문제풀이(off_by_one_001) (0) | 2022.07.16 |