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 |