파이디버거, 스냅샷,
PyDbg 를 한창 배우고 있다.
오늘은 snapshot / restore 에 대해서 공부해 보자. 아래 link 에서 학습한 내용을 정리한 것이다.
- http://loca.kr/entry/PyDbg-%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%95%B4%ED%82%B9-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-3
- http://linkc.tistory.com/entry/Analysis-about-Pydbg-Snapshot
snapshot
snapshot 은 말 그대로 일정시점의 모습을 잡아내는 것이다. 프로그램이 실행되고 있는 한 특정 순간의 상태를 저장해 놨다가 다시 그 모습으로 복원(restore) 시키는 것이다.
간단히 생각하면, 노트북에서 ‘절전모드’ 등으로 들어가기 위해 현재 메모리의 내용을 저장해 놓는 것과 같은 원리라고 하겠다.
여기서 사용한 코드는 아래 blog 의 logic 을 사용했으며, 내가 보기 좋게 정리했다.
- snapshot.py : http://www.mediafire.com/?864ni778t8ynjv5
- a.cpp : http://www.mediafire.com/?6y8gz3i32onz325
test
test 환경
- OS : Windows 7
- Python version : 2.7
- PyDbg module
test 방법
a.cpp 를 compile 해서 a.exe 를 만들자.(참고로 나는 MinGW 의 gcc 를 이용했다.)
그리고 snapshot.py 의 main() 에서 exe_path 를 수정해 주자.
다음 snapshot.py 를 실행한다.
a.exe 는 ‘1 test’ / ‘2 test’ / ‘3 test’ 를 출력하고 sleep() 에 들어간다. 그리고 다시 ‘4 test’ / ‘5 test’ / ‘6 test’ 을 출력하고 sleep() 에 들어간다. 그리고 sleep() 이 끝나면 프로그램을 종료한다.
여기서 우리는 snap 을 test 하기 위해서 아래처럼 “3 test” 가 출력된 후에 snap 을 입력할 것이다. 그리고 나서 4,5,6 이 출력되고 나서 다시 restore 를 입력 해 줄 것이다.
그럼 아래처럼 결과가 나온다. 1,2,3 이 끝난 지점으로 다시 돌아갔기 때문에 4,5,6 이 2번 찍히는 결과가 나온 것이다.
e:\>snapshot.py
1 test
2 test
3 test
Enter: 'snap','restore' or 'quit' : snap
[*] Suspending all threads.
[*] obtaining snapshot.
[*] Resuming operation.
Enter: 'snap','restore' or 'quit' : 4 test
5 test
6 test
restore
[*] Suspending all threads.
[*] restoring snapshot
[*] resuming operation.
Enter: 'snap','restore' or 'quit' : 4 test
5 test
6 test
quit
[*] Exiting the snapshotter.
snapshot.py 작동원리
- snapshot.py 는 2개의 thread 를 만들게 된다.
- 1번째 thread 는 debugger(dbg) 를 만들고, debugger 와 관련된 일(여기서는 snap, restore) 을 하게 된다.
- 2번째 thread 는 입력을 받는다. 입력이 들어오면 입력에 따라 알맞은 동작을 1번째 thread (debugger) 가 하도록 한다.
- input thread 가 debugger thread 를 control 하기 위해 debugger 는 self.dbg 에 저장된다.
댓글 없음:
댓글 쓰기