본문 바로가기
  • True knowledge exists in knowing that you know nothing. -Socrates-
Study/reversing

window xp 지뢰찾기(1)

by intadd 2016. 9. 1.




안녕하세요 이번에는 지뢰찾기 (1) 마지막 편일거 같아요 입니다.




일단 지뢰가 메모리 상에 올라갈 어떤 메모리 주소로 올라가는지 파악해 보겠습니다.




지금 초록색으로 보이는 곳을 보시면 곳을 보시면 LEA 라는 명령어로 주소 값을 복사합니다.



 주소값을 해석해 보면 1005340에서 ESI  더하고 EAX 더한 주소값 입니다.


제가 찾은 ESI 값과 EAX값이 그대로 올라가진 않고 SHL 이라는 명령어로 시프트를  후에 올라갑니다.



그럼 고정적으로 변하지 않는 100540 메모리 주소로 가봤습니다.


 여기서 BP 걸어놨기 때문에 f9 눌러가면서 메모리 값의 변화를 주시해봤습니다그랬더니 저렇게 “?” 라는 문자가 생성 되는 것을   있었습니다.



이것을 실제 Ollydbg 실행시켜 지뢰의 위치를 보면  것이 지뢰 위치라는 것을 확인   있었습니다.

 이제 지뢰가 올라가는 메모리 주소를 알아봤습니다.



그러면 파이썬 코드로 메모리를 불러오는 작업을 했습니다.

코드는 stack buffer overflow 블로그에서 가져온 코드를 이용했습니다.



http://stackoverflow.com/questions/19684697/python-converting-byte-address-from-readprocessmemory-to-string


 코드를 사용했습니다 .



여기서 사용되는 PID  무엇인지 몰라서 찾아보았는데 process id  프로그램이 실행   메모리 종료되기 전까지 올라가는데  프로세스의 ID 였습니다그래서 일단 PID 직접 확인해 보겠습니다.


명령어로 찾는 방법이 있지만 쉽게 PID  확인해 보도록 하겠습니다.

(ctrl+alt+Delete) --> 작업 관리자 --> 세부 정보




이렇게 PID 확인   있었습니다.


하지만 프로그램이 종료되었다 다시 시작 되면 PID 값이 변하기 때문


 이를 자동적으로


구하는 코드가 필요했었는데 첨부되어 있던 위의 코드가 있습니다.



def getpid()



Getpid 라는 함수를 이용해서 pid  구했습니다또한

processHandle 안에 pid 넣어줄  int 형으로 받기 때문에  변환을 해주었습니다.


pid=int(getpid(winmine.exe)[0])

이렇게 processHandle에 넣어줄 때는 이런 식으로 형변환을 해주었습니다.

 


(메모리에 올라가는 명령은 제가 해석 했을 때는 or 연산을 지나면 메모리에 올라갑니다.)



이제 cmd창으로 제가 만든 코드를 실험 해보겠습니다.




이렇게 정상적으로 메모리를 불러 왔습니다.


이제 이것을 실제 지뢰 찾기의 모양처럼 가공 해야 했습니다.


그래서 저는 무식하지만 간단한 re.sub(“변경을 당할 글자”, “변경할 글자”,  대상이 되는 전체 문장)  사용했습니다.


패턴을 분석   아래의 코드 처럼 수정했습니다.


 


실행을 시켜보면



이렇게 제만 이뻐 보이는 문자로 나타납니다.


하지만 지뢰 찾기의 게임 레벨이 존재 했습니다

 ,,고급 이렇게 나누어져 있었습니다.


그래서 이것도 메모리에 올라오기 때문에 지뢰를 불러오는  처럼 동일한 방법으로 불러 왔습니다.


불러 와서 if 조건문으로 프로그램 안에서 판별 했습니다.




지뢰 카운터 주소 찾는방법



 위의 010036FD 주소를 보면 DEC 연산으로 1 감소시키는 명령이 있습니다.


메모리 주소를 찾아가면 1005330 입니다. Ollydbg 확인 해보면,


처음에는 0A  한번 실행시키면 09 .. 08.. 07 이렇게 됩니다.



그리고  되고 다음에는 ran 명령으로 지뢰위치를 만드는 것을 멈추고 다음 명령으로 넘어 갑니다.(JMP 벗어난다.)



이렇게 해서 지뢰의 개수가 저장되는 메모리 주소를   있었습니다.

이렇게 코드를 수정했습니다.




코드에서 제가 수정한 부분은 상당히 더럽고 무식하며 보기 어렵고 이해할 수 없는 코드가 있을 수 있습니다. 또한 오류가 있을 수 있습니다. 

 

결과를 확인해 봅시다.



초급



중급






고급





이렇게 저의 생의 처음 리버싱을 해봤습니다. 


다음에는 시간이 된다면 계속해서 같은 위치의 지뢰가 생성되게 지뢰찾기를 패치하는 것을 공부하고 올릴 생각입니다.




















그리고 이 리버싱 공부를 시작 할수 있도록 과제를 주신 sweetchip 선배님께 진심으로 감사를 드립니다. (하트)




정말 재밌는 리버싱이었습니다. 


앞으로 더 많은 리버싱을(심볼이 없는) 해보도록 하겠습니다.


'Study > reversing' 카테고리의 다른 글

window aslr 제거하는 방법  (0) 2016.09.09
process id (pid)를 쉽게 확인하는 방법 (윈도우)  (1) 2016.09.01
window xp 지뢰찾기(0)  (2) 2016.08.29
리버싱이란 ??  (0) 2016.08.29

댓글