본문 바로가기

Reversing/reversing.kr

reversing.kr 6번 ImagePrc.exe 리버싱 CTF 문제풀이

반응형

오늘은 reversing.kr 6번 ImagePrc.exe를 풀어보려고 한다. 먼저 이전 문제들을 풀지 않은 사람은 공부하고 오길 바란다.

2022.08.05 - [Reversing] - reversing.kr 5번 Replace 문제 풀이. 해석

 

reversing.kr 6번 ImagePrc.exe 문제 개요.

먼저 ImagePrc.exe를 실행해보자.

ImagePrc 문제 개요 1

프로그램을 실행하면 빈창에 Check 버튼만 존재한다. 마우스로 몇 번 클릭해보면 그림이 그려진다.

 

 

ImagePrc 문제 개요 2

이후 그림을 그려 Check버튼을 클릭했더니, Wrong 오류창이 나오는 것을 확인했다. 그렇다면 Check를 했을 때 Correct!가 출력되도록 만드는 것이 이번 문제의 목표이다.

 

 

ImagePrc.exe 문제풀이.

x32dbg에서 ImagePrc.exe를 붙여서 디버거를 실행하자.

 

ImagePrc 문제풀이 1

search for strings를 통해 보면 4013DB에서 'Wrong'이 출력된다. 

 

 

 

ImagePrc 문제풀이 2

코드를 자세히 살펴보면, 반복문을 돌면서 4013A8 주소에서 dl과 bl을 비교하고 있고, dl과 bl이 같지 않으면 'Wrong'이 출력된다. 그럼 더 윗부분에서 dl과 bl에 어떤 값이 들어가는지 확인해보자.

 

ImagePrc 문제풀이 3
ImagePrc 문제풀이 4

먼저 반복문이 시작되는 부분에 브레이크 포인트를 걸고 실행해서  Check를 누르고 F8로 한 칸 진행해보니, 

 

 

ImagePrc 문제풀이 5

bl에 Byte단위로 데이터가 들어가있다. 이 중 bl과 dl을 구분하기가 어렵다. 따라서 프로그램에서 사진 파일을 저장하는 mainfest를 확인했다.

 

 

 

ImagePrc 문제풀이 6

PEview로 mainfest를 보니 00009060 ~ 0001EFE0까지 존재하는 것을 확인할 수 있었다. 그리고 x32dbg에서 Ctrl + N을 통해 함수를 보면 image파일을 다룬다는 것을 알 수 있다. 어떤 함수가 실행되는지 찾아보니,

 

 

ImagePrc 문제풀이 7
ImagePrc 문제풀이 8

GetSystemMetrics라는 함수를 사용해서 그림을 그릴 수 있는 창을 띄운다. 밑에 push들은 파라미터로써 가로: 0x96(150), 세로: 0xC8(200) 크기의 창을 만든다는 것을 알게 되었다.

 

 

ImagePrc 문제풀이 9
ImagePrc 문제풀이 10

그래서 그림판을 통해 150px X 200px인 a.bmp 파일을 하나 만들고, HxD로 열어주었다. 이후 ImagePrc.exe의 00009060 ~ 0001EFE0을 복사해서 a.bmp 파일에 0x36부터 붙여 넣어주고 사진을 열었다.

 

ImagePrc 문제풀이 11

이렇게 GOT가 나왔다. 이를 통해 ImagePrc 문제의 답을 도출하였다.

 

 

이번 문제는 디버거를 사용해 코드를 분석하는 것은 쉬웠으나, HxD를 사용해 이미지를 만들어야 한다는 생각을 하기까지 오래 걸린 것 같다. 흥미로운 문제였다.

 

 

 

 

 

 

728x90