이번 문제는 실행파일 하나가 주어집니다.
이 프로그램을 열어보면
다음과 같이 공백에 Check라고 되어있는 버튼 하나가 있습니다
이 공백에는 아무거나 쓸수 있습니다.
그리고 Check 버튼을 눌러보면
Wrong이라는 메세지박스가 출력됩니다.
먼저 exeinfope로 열어보면
32비트 실행파일에 비주얼 C++로 작성되었고
별다른 패킹은 없습니다.
그럼 IDA로 본격적인 분석을 해보겠습니다.
프로그램에 대해서 생각해보면, 흰색화면에 그림을 그릴수 있고 그 그림을 통해서 검사를 한다는것을 보면
윈도우 api를 통해서 그림을 생성하고 그 그림을 검사하는 루틴이 있을것입니다.
그 루틴을 찾기위해서 먼저 아까전에 메세지박스로 출력되었던 Wrong이라는 문자열을 찾아봐야합니다.
다음과 같이 Wrong이라는 문자열과 이외의 사용된 문자열들이 보입니다.
이 문자열들은 모두 같은 함수에서 쓰인것으로 보이므로
이 프로그램의 전반적인 동작을 담당하는 함수로 확인됩니다.
그럼 이 함수로 진입해보겠습니다.
이 함수의 전체적인 구조입니다. 조금 복잡해보이지만 차근차근 분석해보겠습니다.
가장 먼저 나오는 분기입니다.
이 부분은 호출되는 함수들을 종합해봤을때
DC를 만들고 그것을 활용해서 비트맵 이미지를 만듭니다.
그리고 윈도우와 버튼을 생성하는등의 작업을 진행하는것을 봤을때
이 부분은 그림을 그릴수 있는 윈도우를 만드는 부분이라는것을 알수 있습니다.
여기서 알수있는 사실은 이 프로그램에서 그림을 그릴수 있게 되어있는 창은
비트맵 형식의 그림을 쓴다는것입니다.
그러므로 지금까지 정보들을 종합해서 생각해보면,
비트맵 데이터를 비교하는 분기문을 찾아서 내가 그린 비트맵과 비교되는 비트맵의 데이터를 알아낸다면
문제를 풀수있지 않을까? 라는 생각을 해볼수 있습니다.
그러므로 우선 아까전에 Wrong 메세지박스가 출력되는 분기문을 찾아야 합니다.
이 부분이 Wrong 메세지박스가 출력되는 분기문입니다.
분기가 나눠지는 조건을 보면 ecx와 eax+ecx를 비교해서 같지 않다면 Wrong 메세지박스를 출력하는 로직입니다.
아무것도 그리지 않았을때 ecx의 위치와 eax+ecx 위치에 있는 값들을 봤을때는 다음과 같습니다.
실행했을때 위치가 바뀌는 일은 일어나지 않습니다.
이 중에서 어느것이 비교대상이 되는 비트맵 인지 구분이 안가기 때문에
어떻게 구분을 할수 있을까 생각을 하다가 든 방법은 다음과 같습니다.
기본적으로 주어지는 이미지의 데이터들을 보면 기본적으로 흰색 바탕이기 때문에
FF로 되어있습니다.
그런데 아무런 그림을 그리지 않았을때
ecx의 데이터들을 보면 FF를 제외한 다른 데이터를 찾아봐도 전혀 보이지 않고
eax+ecx 에 있는 데이터들을 찾아보다보면
중간중간에 다음과 같이 00이라는 데이터가 섞여있습니다.
그리고 결정적으로 Check 버튼을 입력하기전에 다음과 같이
선을 화면 가득 메워놓은뒤에 Check버튼을 눌러서 데이터를 확인해보면
eax+ecx 의 데이터는 별반 차이가 없는건에 비해서
ecx의 데이터는 다음과 같이 00 값이 중간중간 많아졌습니다.
그러므로 비트맵 이미지의 데이터를 비교할때 쓰이는 데이터의 위치는
eax+ecx 인것입니다.
그렇다면 이제 해야할것은 eax+ecx 에 위치한 비트맵 데이터를 복사해서
비트맵 이미지를 만들어서 확인해 봐야합니다.
중간중간에 00 값이 섞여있는것을 보면, 뭔가 그려져 있다는것이므로
이 이미지를 확인해보면 뭔가 실마리가 생길수 있기 때문입니다.
우선 이 이미지의 가로세로 폭을 확인하는 작업을 거쳐야 합니다.
IDA를 통해서 확인해보면 가로는 200, 세로는 150이고 비트는 24비트입니다.
그러므로 그에 맞게 그림판에 이미지 크기를 설정해줍니다.
그리고 이 그림을 24비트 비트맵 으로 저장해줍니다.
그리고 아까전의 데이터를 뽑아내기 위해서 HxD 를통해서 파일을 열고나서
밑으로 쭉 내리다보면
다음과 같이 아까전에 본것과 같은 데이터들이 모여있습니다.
이 데이터의 끝을 확인해보면
아까전에 확인한 eax+ecx에 위치한 데이터처럼 끝에 데이터가 00으로 한줄있습니다.
그러므로 이 데이터를 이용해서 비트맵 이미지를 만들어야 합니다.
아까전에 생성한 빈 비트맵 이미지를 HxD를 통해서 열어줍니다.
그리고 아까전에 찾았던 비트맵 데이터를 블록선택 기능을 활용해서 선택한뒤 복사해서
비트맵 헤더를 제외한 나머지 영역에 붙여넣기 해줍니다.
그리고 이제 저장하면 성공적으로 프로그램 내에 있던 비트맵 이미지를 뽑아냈습니다.
이제 이미지를 확인해보면
다음과 같이 성공적으로 이미지가 보이게 되었습니다.
이걸 입력해보면
성공 메세지가 나오는걸보니 이것이 플래그였던것같습니다.
이번 문제는 비트맵에 대한 기본지식이 부족하다보니
비트맵 헤더부터 다시 공부하느라 푸는 시간이 생각보다 걸린 문제였습니다.
'워게임 > Reversing.kr' 카테고리의 다른 글
[Reversing.kr] Replace 풀이 (0) | 2022.06.30 |
---|---|
[Reversing.kr] Music Player 풀이 (0) | 2022.06.29 |
[Reversing.kr] Easy Unpack 풀이 (0) | 2022.06.29 |
[Reversing.kr] Easy Keygen 풀이 (0) | 2022.06.29 |
[Reversing.kr] Easy Crack 풀이 (0) | 2022.06.29 |