<04장 - PyDbg 순수 파이썬 윈도우 디버거>
4.1 ㅡ 브레이크 포인트 확장
PyDbg를 이용하면 사용자 정의 콜백 함수를 구현함으로써 이벤트 핸들러를 쉽게 확장시킬 수 있다. 콜백 함수에 디버그 이벤트가 발생했을 때 수행될 로직을 구현해 넣으면 된다.
호출된 콜백 함수가 리컨을 하면 제어권은 디버거에게 넘어가고, 디버거는 디버깅 대상 프로세스가 계속 실행되게 한다.
소프트 브레이크 포인트를 성정하는 PyDbg 함수의 프로토타입 :
address : 소프트 브레이크 포인트를 설정할 주소
description : 브레이크 포인트에 교유한 이름을 부여할때 사용 (선택적으로 사용한다)
restore : 발생한 브레이크 포인트를 초리한 이후에 자동으로 해당 브레이크 포인트를 해제할 것인지에 대한 여부
handler : 브레이크포인트가 발생했을때 호출할 함수를 지정
사용자 정의 콜백 함수 구현 :
다음 코드들을 작성하자
>>printf_loop.py
>>printf_random.py
이 두 스크립트를 실행하면, counter의 값이 4라서, 4번째 루프까지는 printf_loop.py가 정상적으로 실행된다. 하지만, 5번째 루프부터는 난수를 출력한다.
4.2 - 접근 위반 핸들러
PyDbg를 이용하면 접근 위반 핸들러를 쉽게 설치할 수 있으며, 예외와 관련된 모든 정보를 쉽게 얻을 수 있는 유틸리티 함수들을 사용할 수 있다.
버퍼오버플로우를 발생시키는 테스트 프로그램을 작성해 보자.
>>buffer_overflow.py
그리고 핸들러 스크립트 파일도 만들자
>>access_violation_handler.py
이제..
1. buffer_overflow.py 를 실행시킨다. (buffer_overflow.py는 실행을 ㅁ머추고 키를 누를때까지 대기하고 있을꺼다.)
2. access_violation_handler.py를 실행시키고 buffer_overflow.py의 PID를 입력한다. (여기서 디버거가 buffer_overflow.py에 붙는다)
3. buffer_overflow.py를 계속 실행되게 만든다.
이때 출력 내용을 통해 알 수 있는 것들 :
1. 접근 위반 예외를 발생 시킨 명령, 그 명령에 속한 모듈
2. 모든 레지스터의 컨텍스트 정보
3. 예외를 발생시킨 명령어 주위에 있는 명령어들을 디스어셈블 한거
4. 예외가 발생했을때 등록되는 SEH핸들러 리스트
4.3 - 프로세스 스냅샷
PyDbg에서 프로세스 스냅샷을 이용하면, 프로세스를 일시 중지시켜 메모리 내용을 얻을 수 있고, 다시 그 프로세스가 실행되게 만들 수 있다.
프로세스 스냅샷 얻기위한 방법 :
1.스레드 리스트를 구하고 각 스레드의 CPU 컨텍스트 정보를 구한다
2. 스냅샷을 복원하고자 할 때 어떤 정보를 복원할 것인지에 따라 저장한 정보를 판단하고 필요한 정보를 저장한다.
3. 프로세스 스냅샷을 위한 정보를 구하기 전에 샐항중인 모든 프로세스를 일시 중지 시킨다. 일시 정지를 위해 suspend_all_threads() 사용, 다시 실행되기 위해선 resume_all_threads() 를 이용!]
4. 스레드를 다 일시 정지 시킨 후, process_snapshot() 을 호출. 이렇게 프로세스 스냅샷을 만든 다음에는 모든 스레드를 다시 실행되게 만든다.
5. 나중에 스냅샷이 만들어진 시점으로 복원하고 싶으면 모든 스레드를 일시정지 시키고 process_restore()를 호출하고 모든 스레드를 재실행시킨다.
사용자가 키를 누르면 스냅샷을 만들고 다시 키를 누르면 스냅샷을 만든 시점으로 복원하는 테스트 프로그램:
>>snapshot.py
'[보안 Archive] ~2017 > 파이썬 해킹 프로그래밍' 카테고리의 다른 글
05 - Immunity Debugger (0) | 2015.01.26 |
---|---|
파해프 3.1 - 디버기 (0) | 2015.01.19 |
댓글