write-up 몇개 쓰니까 정성이 안들어간다.
귀차너..
부산컴 너무느려..
실행하면 이런 화면이 나오고 흰 배경에 마우스로 그림을 그릴 수 있다.
check버튼을 누르면 wrong 이라는 메세지 박스가 뜬다.
맞는 그림을 그려줘야하는것 같다.
우선 ollydbg로 열어보자
체크 버튼을 눌렀을 때 Wrong이라는 메세지 박스가 떴으므로 우선 참조문자열 목록부터 쭉 살펴보자
(마우스 오른쪽버튼을 누르는 동시에 s를 누르고 찾아서 클릭하면 좀 멋있어보인다.)
Wrong 과 Check, Button등 수상한 문자열을 많이 찾았다.
모두 비슷한 위치에서 참조되었으므로 해당 루틴으로 직접 가서 살펴보자
Wrong을 참조한 함수이다. 메세지 박스 api를 호출하고있고 4013AA에서 점프해왔다는걸 알 수 있다.
ctrl + G로 따라가보자
꽤 많이 돌아가는 루프문이 나왔다.
내용은 ecx와 ecx + eax에 있는 값을 비교해서 다르면 Wrong을 출력하는 루틴으로 점프한다.
총 0x15F90번 실행된다. 계산기를 돌려보니 정확히 90000번이다. 반복횟수를 보니 아마 화소를 하나하나 비교하는 루프문일 것 같다.
그 위로 쭉 올라가며 살펴보니 수 많은 윈도우 , 비트맵 생성 api가 있었다.
그리고 우리는 여기서 해상도 정보를 찾을 수 있다. (150x200)
이제 저 루프에 브레이크를 걸고 eax+ecx와 ecx에 담겨있는 값을 직접 보자.
eax는 0xFD52E018 ecx는 0x02F50048
ecx는 데이터 영역의 주소고 eax는 메모리 주소 오프셋인것 같다.
ecx + 15F90 = 2F65FD8
ecx = 2F50048 ~ 2F65FD8
eax + ecx = 47E060 ~ 493FF0
둘 중 하나는 정답이미지이고 하나는 내가 그린 그림이 나올 것이다.
그럼 이제 저 메모리 주소에 있는 헥스값을 어떻게 그림으로 바꿀 것인가..
우선 확장자를 뭘로 해야할지부터 정해보자
현재 루프에서 비교하는 메모리값은 총 90000개고 그림의 해상도는 200x150이다.
200 x 150은 30000이므로 총 30000개의 화소인데 메모리값은 90000개니까 화소 하나당 3바이트의 메모리값을 쓴다고 볼 수 있다.
필자도 이미지 파일 확장자를 잘 몰랐는데 그림판 만지다보니 24비트 bmp라는 확장자가 있더라
24비트 bmp형식의 150x200 그림 파일을 하나 만들고 헥스 에디터로 까보면 이렇게 생겼다.
딱 봐도 그림 데이터가 시작되는 부분이 명확하게 보인다.
따라서 그 부분을 우리가 복사해온 데이터로 덮어쓰고 보면 된다. 이렇게 하면 내가 그린 그림과 정답이미지를 볼 수 있다.
++ 생각보다 올리디버거에서 복사한 메모리 헥스값 편집하기가 불편한데
visual stdio로 편집하면 정규식 사용도 되고 아주 편리하다.
끝
p.s. 정답이 plt랑 짝궁먹는 그건가..? 다른 분 블로그 보니까 욕이라던데 ㅋㅋ;
'write-up > reversing.kr' 카테고리의 다른 글
Replace (0) | 2018.12.19 |
---|---|
position (0) | 2018.12.18 |
Easy_CrackMe 풀이 (0) | 2018.12.03 |