본문 바로가기

드림핵

[드림핵 워게임] patch

<문제>

 

 

<풀이>

먼저 다운로드한 실행파일 patch.exe를 실행해보았다.

플래그로 보이는 이미지가 가려져있다.

 

ida를 이용해 patch.exe를 연다.

처음 뜨는 화면은 열 파일에 대한 정보를 보여준다.

변경사항 없이 OK를 클릭한다.

 

 

patch문제는 WinAPI를 이용해 만든 프로그램이기 때문에 WinMain 함수를 찾아야 한다.

WinMain함수가 일반적으로 상호참조하는 함수를 찾아 WinMain 함수를 찾아 올라가는 방식으로 찾아본다.

 

import 탭을 클릭한다.

 

CreateWindowExW라는 함수를 찾는다.

이 함수는 보편적으로 윈도우를 생성할 때 사용하는 함수로, WinMain에서 호출한다.

더블클릭해서 함수가 임포트되는 곳으로 간다.

 

CreateWindowExW를 클릭하고 단축키 x를 눌러 상호참조하는 함수를 찾는다.

 

WinMain 함수를 찾을 수 있다. 더블클릭하고 F5 단축키를 눌러 WinMain 함수를 디컴파일한다.

 

 

디컴파일된 WinMain 함수에서 14번째 행에 있는 sub_1400032F0이 메시지콜백함수이다.

(이 부분은  MSDN에서 찾아보면 알 수 있다.)

해당 함수를 더블클릭해서 들어가본다.

 

BeginPaint() 함수와 EndPaint() 함수를 찾을 수 있다.

그 사이에 있는 sub_140002C40() 함수가 중요해보인다.

 

sub_140002C40()함수로 들어가본다.

sub_140002B80함수가 여러번 호출되고 그 이후에 서로 다른 함수가 한번씩 호출된다.

 

함수의 기능을 살펴보기 위해 breakpoint(F2)를 걸고 F9로 실행해본다.

F8을 한번씩 눌러가며 실행창을 확인한다.

 

이랬던 창이

 

한 줄 실행하면 이렇게 된다.

 

sub_140002B80() 함수가 플래그를 가리는 기능을 하는 것으로 보인다.

해당 함수를 지우면 플래그를 깨끗하게 볼 수 있을 것이다.

 

IDA View-A창으로 간다.

단축키 g를 누른 후 140002B80을 입력하여 어셈블리 코드 상에섯 sub_140002B80 함수를 찾는다.

 

코드를 수정하기 위해

Edit > Patch program > Assemble... 을 클릭한다.

 

Instruction을 ret로 수정한다.

이렇게 하면 sub_140002B80 함수가 호출되었을 때 아무 동작도 하지 않고 바로 return 되므로

플래그 위에 마스크를 덮는 동작이 일어나지 않게 될 것이다.

OK를 클릭한다.

 

코드 상에 140002B80부분이 retn으로 수정된 것을 확인할 수 있다.

 

수정한 어셈블리 코드를 적용하기 위해

Edit > Patch program > Apply patches to input file... 을 클릭한다.

 

창이 뜨면 변경사항없이 OK를 클릭한다.

 

F9를 눌러 수정된 파일을 실행한다.

실행된 Patch 창을 확인해보면 flag를 볼 수 있다.