본문 바로가기
Write-up/dreamhack.io

[Dreamhack.io] patch

by 새달아 2022. 11. 9.

dreamhack.io의 patch 문제이다. 패치는 아마 리버싱을 계속 한다면 정말 많이 쓰게될 내용이라 진짜 좋은 문제라고 생각했다.

 

https://dreamhack.io/wargame/challenges/49/

 

patch

flag를 그리는 루틴을 분석하고 가려진 flag를 보이게 해주세요. Reference GDI+ - Win32 apps | Microsoft Docs Graphics Functions - Win32 apps | Microsoft Docs File — x64dbg documentation

dreamhack.io

 

#문제분석

patch 파일을 실행시키면 플래그 형식이 나오고, 플래그 값이 지워져있는 것을 확인했다. 뭐 어떻게 찾으라고...

일단 x64dbg로 열어보자.

 

F8 사용해서 쭉 실행하다가 여기 함수에서 플래그가 띄워지는 것을 확인했다. patch.7FF6F9AA30A0 함수를 자세히 보기로 하자.

 

해당 함수 내부로 들어오면 <ShowWindow><UpdateWindow>에서 patch 파일의 그래픽이 그려진다. 자세히 설명하자면 <ShowWindow>에서는 patch의 실행창을 띄워주고 <UpdateWindow>에서는 기존의 아무것도 없던 실행창에 그림을 그려준다.

그래서 <UpdateWindow>에서 F7을 사용하여 계속 돌려봤는데....

 

두둥... 어느순간 이런 그림이 그려졌다...

아하, 해당 프로그램은 우선적으로 플래그를 가리는 그림을 그려놓고 이후에 플래그를 그려내는 작동방식을 지니고 있구나~ 라고 생각했다. 물론 이걸 말로 하지는 않았다. 아무튼... 해당 그림이 그려지는 함수 부분을 자세히 보면...

이렇게 patch.7FF6F9AA2B80 함수를 호출할 때 마다 한 줄씩 그려지고, 이 함수는 엄청 많다...

 

IDA로도 살펴보자.

IDA로 돌려보면 이렇게 슈도코드가 나오는데, 일단 위에서부터 보면...

v11은 사이즈나 스타일 등을 정의하는 것을 봐서 이 그림을 그리는 구조체인 듯하다.

그래서 가장 먼저 나온 함수인 sub_1400032F0을 먼저 봤다.

 

해당 함수를 들어가니 BeginPaint부터 EndPaint 사이에서 그림이 그려지는 듯 하다...!

이유는 해당 함수 이름이 그러니까... 그래서 그 사이에 있는 함수인 sub_140002C40을 확인했다.

 

v27을 기점으로 위에는 아까 봤던 sub_140002B80이 나오고 밑에는 flag를 그려주는 듯 하다.

자 이제 분석 다했으니 풀기만 하면 된다!

 

#문제풀이

해당 문제를 분석하고 나서 2가지의 풀이방법이 떠올랐다.

1. sub_140002B80 함수를 진행시키지 않는 방법.

2. v27 밑에 있는 함수들을 분석하고 내가 따로 코드를 작성하여 flag만 뽑아내는 방법.

 

당연하게도 이 문제 이름이 patch고, 1번 방법이 압도적으로 편하기 때문에 patch를 사용할 것이다.

방법은 간단한데, x64dbg로 패치를 진행해보자.

 

sub_140002B80 함수로 진입하여 가장 첫 줄에 ret을 입력한다면, 해당 함수의 내용을 실행하지 않고 바로 반환해주기 때문에 그림이 그려지지 않는다...!

해당 패치를 진행하고 프로그램을 실행시키게 되면...

 

DH{UPATCHED}

쨘! 이렇게 쉽게 flag를 얻을 수 있다!

'Write-up > dreamhack.io' 카테고리의 다른 글

[Dreamhack.io] Secure Mail  (1) 2022.11.02
[Dreamhack.io] rev-basic-7  (1) 2022.11.02
[Dreamhack.io] rev-basic-8  (0) 2022.08.31
[Dreamhack.io] Inject ME!!!  (1) 2022.08.30
[Dreamhack.io] rev-basic-1  (0) 2022.08.30