-
[reversing.kr] ImagePrc 풀이Wargame/reversing.kr 2021. 5. 9. 21:10
1. 프로그램 분석
첨부파일을 실행시켜보자.
위와 같이 창이 하나 나타나는데, 아래와 같이 그림판 같은 기능을 한다.
하단의 Check 버튼을 눌러보자.
그러자 위와 같이 Wrong이라는 문구를 출력하는 메시지 박스가 나타난다. 무언가 그려진 그림이 특정 조건을 만족시켜야 하는 듯하다.
2. Debugging(with x32dbg)
x32dbg로 ImagePrc.exe 파일을 열고, MessageBox API에 BP를 설정한 후 실행시키고 Check 버튼을 누르면 다음과 같이 BP에 적중한다.
스크롤을 조금 더 올려보자.
스크롤을 올려보면 004013AA의 jne 명령어에 의해 Wrong 메시지 박스를 호출하는 루틴으로 점프하는 것을 확인할 수 있다. byte 단위로 무언가를 비교하는데 빨간 표시를 한 loop 부분을 보면 15F90번만큼 비교가 진행되는 것을 확인할 수 있다. 무엇에 대한 비교가 이뤄지는 것일까? 스크롤을 더 올려보자.
위쪽에서 리소스 관련 API들을 호출하는 것을 확인할 수 있다. FindResourceA API를 msdn에 검색해보자.
HRSRC FindResourceA( HMODULE hModule, LPCSTR lpName, LPCSTR lpType );
각각 인자로, 0, 0x65, 0x18 이 넘어가는 것을 확인할 수 있다. hModule이 0인 경우 현재 실행되는 프로세스에 대한 핸들을 가리키고, lpName에는 resource의 ID, lpType에는 resource의 type이 나타난다. resource의 ID에 주목해보자. ID가 0x65인 리소스를 갖고 있는지 PEView를 통해 확인해보자.
확실히 0065 ID를 갖는 리소스가 있다. 대부분이 FF로 채워져 있는 것을 확인할 수 있다. 아마도 그려진 그림과 이 리소스에 있는 그림을 비교해서 정확히 일치해야 함을 추측할 수 있다. 하지만 이는 현실적으로 불가능하고, 주목적 또한 flag 획득이기 때문에, 본래 그림이 무엇일지 찾아내는 방향으로 접근해보자. 스크롤을 조금 더 올려보자.
위와 같이 BitBlt, CreateCompatibleBitmap API가 호출되는 것으로부터 리소스가 bitmap 형태임을 추측해볼 수 있고, 동그라미 친 부분으로부터 width=0xC8, height=0x96 임을 알 수 있다. 각각 십진수로는 200 x 150이며 이를 그림판에 그린 후, HxD로 열어서 리소스 부분을 복사 붙여 넣기 하면 flag가 그려진 그림이 나타난다.
bmp 파일의 헤더 부분에 대한 정보는 다음 링크를 참조했다.
dojang.io/mod/page/view.php?id=702
3. Comment
사실 이 문제는 배점이 낮았지만 잘 모르겠어서 다른 여러 블로거들의 풀이를 바탕으로 해결하였다. 손상된 리소스를 구글링을 통해 헤더 부분이 어떻게 구성되어있는지 확인하고, 복구하는 연습을 해 볼 수 있었다.
반응형'Wargame > reversing.kr' 카테고리의 다른 글
[reversing.kr] Position 풀이 (0) 2021.05.22 [reversing.kr] Replace 풀이 (0) 2021.03.09 [reversing.kr] Music Player 풀이 (0) 2021.02.09 [reversing.kr] ransomware 풀이 (0) 2021.01.08 [reversing.kr] Easy ELF 풀이 (0) 2021.01.05