| ImagePrc
오늘의 문제는 120점 짜리 ImagePrc 문제다.
실행 파일을 실행하면 그림을 그릴 수 있는 프로그램이 실행된다.
Check를 누르면 Wrong이라고 뜨는 에러 메시지가 출력된다.
| OllyDbg
우선 올리디버거를 실행시킨다.
에러 출력문의 부분으로 가기 위해
마우스 오른쪽 버튼 > Search for > All referenced text strings를 누른다.
Wrong이 있는 부분을 더블 클릭하면 해당 영역으로 이동할 수 있다.
Wrong 에러문이 출력되는 윗 부분을 우선적으로 살펴 보도록 하겠다.
하지만! 연산자가 너무 많이 나오기 때문에 몇몇 연산자의 개념을 정리하고 가자
ZF(Zero Flag)
- 제로 플래그이므로 0이면 참이기 때문에 1로 세팅
- 0이 아니면 제로가 아니기 때문에 0으로 세팅
=> 0이면 1, 0이 아니면 0
JNZ(Jump if Not Zero)
- 여기서 Not Zero면 1이므로 제로플래그는 0
- 제로 플래그가 0이면 점프
CMP A, B
- Compare의 약자로 A에서 B를 빼서 값을 비교하여 같으면 결과는 0
-> 값 초기화 시에도 사용한다.
* 혹시 뒤에 제로 플래그가 나올 시 같으면 제로플래그가 1로 세팅 다르면 제로플래그는 0
INC(increase) A
- A를 1 증가시킴
MOV A, B
- B에서 A로 데이터를 복사한다.
이제 다시 Wrong의 윗부분을 한줄 씩 살펴보자면
DL에 ECX 값을, BL에 EAX+ECX 값을 넣는다.
DL과 BL의 값을 비교해서 같으면 결과는 0이 된다.
Not Zero면 점프하므로 CMP의 결과가 같지 않으면Wrong을 출력할 수 있는 부분인 004013CD로 Jump한다.
INC 연산자로 EDI와 EAX 각각 1씩 증가시킨다.
이 부분은 반복되는데 EDI와 15F90을 비교해서 EDI가 작으면 004013A3으로 점프한다.
* 참고로 15F90은 10진수로 90,000
그렇다면 얼마나 루프를 도는 지 알기 위해서 EDI의 초기 값이 중요하다.
XOR EDI, EDI 연산을 하는 것을 볼 수 있는데
결국 같은 값 끼리 XOR 연산을 하기 때문에 EDI는 0으로 세팅되는 것을 알 수 있다.
따라서 0부터 1씩 증가하며 15F90(90,000)까지 반복되므로 총 90,000번의 비교를 반복한다.
결과적으로 Wrong으로 가지 않기 위해선 DL과 BL의 값이 같아져야 한다.
| PEview
여기서부터 약간 막혀서 우선 PEview를 살펴보았다.
이미지에 해당하는 리소스 영역을 보면 사이즈 부분에 익숙한 15F90을 볼 수 있다.
아마도 이 프로그램은 사용자가 그려넣은 이미지와 정답 이미지의 픽셀 하나하나를 비교하면서
모든 픽셀이 일치하면 문제가 해결되는 것 같다.
그렇다면 정답 이미지 사이즈와 같은 임시 비트맵 파일을 만들어 놓고
리소스 영역의 데이터 부분을 붙여넣으면 정답이 나올 것 같다.
올리디버거의 함수들을 살펴보면 비트맵을 의미하는 함수의 이름과 함께
Height = 150, Width = 200이 계속 나오는 것으로 보아 해당 이미지의 크기를 알 수 있다.
그림판으로 높이 150, 넓이 200의 비트맵 이미지를 만들고 저장한다.
| HxD
HxD를 이용해 ImagePrc의 리소스 영역의 데이터 부분을 복사한 후
만들어 둔 비트맵 이미지의 데이터 영역에 붙여넣기 한다.
해당 이미지를 다시 열어보면 정답이 보이고 그걸 플래그로 입력한다.
'2. Reversing (리버싱) > 1) Write UP' 카테고리의 다른 글
[2020.05.14] CSAW365 | Gametime (0) | 2020.05.14 |
---|---|
[2020.05.14] CSAW365 | Gametime (0) | 2020.05.14 |
[2020.05.14] Reversing.kr | AutoHotkey1 문제 (0) | 2020.04.26 |
[2020.03.31] Reversing.kr | KeyGen (0) | 2020.04.26 |
[2020.04.07] Reversing.kr | CSHOP 문제 (0) | 2020.04.25 |