지뢰찾기(Winmine.exe)-Windows xp version(2) 맵핵
맨날 Key값이랑 OEP, 패커 문제만 풀다가 실제 프로그램을 분석해보니 시간도 굉장히 걸리고 어려웠습니다. 지금도 다 파악하지 못하고 분석 중 입니다.
함수의 호출방식만 임의적으로 고쳐서 일단 허접한 맵핵을 만들었습니다.
-맵핵을 만들기 위해 한생각들
:프로그램의 실행부분을 찾고 실행부분에 ShowBombs(x)함수를 넣어서 실행하면 맵핵이 될 것이다. (ShowBombs(x)은 지뢰를 보여주는 함수-분석하면 알 수있습니다.)
이 방법은 더 해봐야 하겠지만 적절히 CALL함수를 넣을 장소를 찾지 못했습니다.
:IDA pro로 함수들을 보면 rand()랑 srand()함수가 있습니다. srand는 (seed값을 정해주어야 함) rand, srand 프로그램 시작전에 분석해서 위치를 알아보려했지만 이게 어떤식으로 돌아가는지 아직 모르겠어서 이 방법은 더 해봐야 할 것같습니다.
-선택한 방법
맨첨에 dohelp()함수가 무슨함수인지 알 지못해서 써먹지 못했는데 지뢰찾기에서 도움말(F1)이라는 것을 알게 되고 프로그램을 실행한뒤 F1을 누르면 지뢰를 보여주는 방법을 생각했습니다.
지뢰찾기를 하는 도중 F1를 누르면 도움말이 뜹니다. (윈도우 xp 지뢰찾기하다가 F1눌렀을 때 창은 뜨지 않고 잠깐 멈추더라고요....원래 도움말이 떠야 정상인데 왜그러는지는 잘 모르겠습니다.....)
따라서 Dohelp함수의 첫부분에 BP를 걸고 실행!!
잘 멈추는 것을 확인했습니다. 직접해보시면 될꺼에요
----------------------------------------------------
01003D76: 도움말 함수의 시작 부분
01003DF2: 도움말 함수의 끝
01002F80: 지뢰를 보여주는 함수의 시작부분
----------------------------------------------------------------
중요한 주소는 저 세 개입니다.
F1을 눌렀을 때 01003D76부터 시작되는데 우리는 도움말을 보는 게 필요한게 아니라 지뢰를 봐야하기 때문에 Dohelp함수의 단축키만 필요한 거지 내용이 필요한게 아닙니다. 이를 이용하여 시작부분을 바꾸어 주어야 합니다.
원래 처음에는 이렇게 사용할 스택을 할당하는 코드와 끝은 RETN 8(ESP+8)로 스택을 정리하는 코드로 이루어졌습니다. (스택을 할당했으니 정리하는 것은 당연한 것)
첫부분을 이렇게 바꾸어 주었습니다. 이 코드는 위의 중요하다고 한 주소를 응용한 것입니다. (PUSH 0A로 CALL문의 인자를 설정해 준 것은 IDA로 들어가서 함수목록을 보면 게임종료 함수가 있습니다. 게임종료 함수는 지뢰를 밟으면 지뢰의 위치를 보여주니 종료함수에서도 ShowBombs()함수를 사용하는데 인자가 항상 0A이더라고요 그래서 임의로 넣었습니다. )
저도 처음 여기까지는 진행을 했는데 왜 변경 코드를 저장하고 프로그램을 실행한뒤 F1을 누르면 프로세스가 종료되는지 알지 못하다가 구글링으로 찾아봐서 저랑 비슷한 방법으로 푼분의 글을 보고 알게되었습니다. Dohelp()함수의 변경전에는 스택을 할당했으므로 해체하는게 당연하지만 변경후 코드는 스택을 할당하는 코드를 지우고 새로 추가한 것이고 함수의 반환값만 필요하기 때문에 retn으로 바꾸어 주어야합니다. (retn은 eax값을 리턴)
파일첨부:
0 개의 댓글