워게임 풀이
Reversing.Kr
This site tests your ability to Cracking & Reverse Code Engineering. Now Challenge a problem for each environment. (Windows, Linux, .Net, Flash, Java, Python, Mobile..) Admin E-Mail: gogil@reversing.kr
reversing.kr
4. ImagePrc
문제 파일을 다운받으니 그림?을 그릴 수 있었다.
Check를 누르면 'Wrong'이 뜬다. 뭔가 그림을 검사 맞는 것 같다..
exe 파일이니 올리디버거로 열어주었다.
에러 메세지를 출력하는 'Wrong' 부분을 찾고 이 위 부분을 분석해봤다.
004013A3부터
DL에 ECX 값을, BL에 EAX+ECX 값을 넣는다.
DL과 BL의 값을 비교해서(CMP) 같으면 0이 되고, 같지 않으면 Wrong을 출력하는 부분인 00401CD로 점프한다.
AC부터 INC 연산자로 EDI와 EAX 각각 1씩 증가하는 것을 확인할 수 있다.
AE를 보면 EDI와 15F90을 비교해서(CMP) EDI가 작으면 A3으로 점프한다.
위처럼 루프를 돌기 때문에 루프를 얼마나 도는 지 알기 위해서는 EDI의 초기값이 중요하다.
이는 조금 위를 보면 바로 알 수 있다!
9D에서 XOR EDI, EDI 연산을 하는 것을 볼 수 있다. 같은 값끼리 XOR 연산을 진행하는 것이기 때문에 EDI는 0으로 세팅된다!!
따라서 0부터 1씩 증가하면서 15F90(10진수로 90,000)까지 반복되므로 루프는 총 90,000번 실행된다. 결과적으로 Wrong으로 가기 위해서는 DL과 BL의 값이 같아져야 한다.
이미지에 해당하는 리소스 영역을 보면 Size에 '15F90'을 볼 수 있다. 아마 사용자가 그려넣은 이미지와 정답 이미지의 픽셀을 하나하나 비교하면서 모든 픽셀이 일치할 경우 문제가 해결되는 것으로 보인다.
정답 이미지와 같은 사이즈의 임시 비트맵 파일을 만들어 논 후 리소스 영역의 데이터 부분을 붙여 넣으면 flag가 나올 것으로 예상된다.
올리디버거에서 함수를 보다보면 비트맵을 의미하는 함수의 이름과 함께 Height=96(150), Width=C8(200)이 계속 나온다.
*16진수 96, C8은 각각 십진수로 150, 200이다.
그림판으로 높이 150, 넓이 200의 비트맵 이미지를 만들고 저장한다.
HxD를 이용해서 ImagePrc의 리소스 영역을 복사한 후 아까 만든 비트맵 파일에 붙여넣는다.
아까 생성한 비트맵 이미지 파일에 붙여넣는다.
저장한 후 비트맵 파일을 열어보면 'GOT'라는 flag가 뜨는 것을 확인할 수 있다!!
GOT
'Reversing' 카테고리의 다른 글
[Reversing] Music Player_WirteUp (0) | 2023.05.13 |
---|---|
DLL, IAT, EAT 분석 (0) | 2023.05.12 |
[Reversing] Easy ELF_WirteUp (0) | 2023.04.29 |
[Reversing] Easy Keygen_WirteUp (0) | 2023.04.29 |
PE 구조(2)__notepad.exe(메모장 프로그램) PE 헤더 분석 (0) | 2023.04.28 |