둘둘리둘둘리둘둘리둘둘리둘둘리둘

[책] Gray Hat Python 소스코드 오류 해결책(작성중) 본문

Python

[책] Gray Hat Python 소스코드 오류 해결책(작성중)

dool2ly 2015. 12. 21. 19:07



  Justin Seitz의 Gray Hat Python - Python Programming for Hackers and Reverse Engineers(2009)를 읽으며 책에 나와있는 소스만으로 코딩했을시 생기는 오류들과 그에 해당하는 소스 수정,추가,제거를 통해 오류해결법을 제시하겠습니다. 현재 작성중이며 내용은 계속해서 추가하겠습니다..(읽으며 작성중...)



@ 3.4.1 SoftBreakpoints (p43)


  책에 소개된대로 빌드 후 my_test.py를 실행시키면 Access Violation 이벤트만 계속 발생되는데, 이 이유는 책의 소스는 브레이크 포인트 설정후 바로 Debuggee를 재개시켜버려서이다.

책의 bp_set 함수에서 printf의 시작을 0xCC(INT3)로 바꾼 후 해당 이벤트 핸들러에서 바로 재개시켜 원래의 printf함수의 시작주소가 아닌 INT3 Instruct를 실행한 후인 printf address+1에 해당하는 주소부터 시작되어, 해석되는 기계어가 꼬여버리고 결국 적절하지 못한 접근으로 인해 printf함수 내에서 Access Violation 이벤트가 발생하는 것 이다.


-해결방법 : context.eip를 현재 주소 -1로 수정하고 printf의 원래 Instruct로 바꿔준후 실행 재개

def exception_handler_breakpoint(self):    # 수정

        print "Exception Address: 0x%08x" % self.exception_address

        if self.bp_unset(self.exception_address):    # 0xCC를 원래의 값 0x6A로 바꿔줌

            print "[*] Hit user defined breakpoint."

            self.fix_eip(1)                # Context를 이용해 EIP를 원래의 printf시작주소로 변경

        else:

            print "[*] Hit windows driven breakpoint."


        return DBG_CONTINUE


def bp_unset(self,address):    # 추가


        if self.breakpoints.has_key(address):    #여기 주소가 없으면 OS가 할당한 BP

            original_byte = self.breakpoints[address][1]

            self.write_process_memory(address,original_byte)

            return True

        else:

            return False


def fix_eip(self, byte):    #추가


        self.context.Eip = self.context.Eip - byte

        if not kernel32.SetThreadContext( self.h_thread, byref(self.context)) :

            print "[*] SetThreadContext error."

            exit()

위와 같이 소스를 변경하면 BP를 풀어버리기 때문에 Attach후 첫 printf외에는 디버깅 이벤트없이 계속해서 진행된다.


※추가 : my_debugger 클래스->get_debug_event함수의 get_thread_context의 파라미터가 쓰레드의 핸들값으로 작성되어있는데, 원래는 쓰레드 ID를 넘겨야 함으로 debug_event.dwThreadId로 수정해줘야함




@ 3.4.2 Hardware Breakpoints (p47)


  bp_set_hw 함수 작성시 for thread_id in self.enumerate_threads(): 에서 마지막의 return True까지 return True를 재외하고 모두 for문 안으로 넣어야함(저자가 모든 쓰레드에 Hw BP를 걸것이라고 했으니)


관련상수 : DBG_EXCEPTION_NOT_HANDLED(0x80010001)

'Python' 카테고리의 다른 글

[Windows] ez_setup, pip 설치  (0) 2016.07.25
Windows, ctype, C, python 데이터 타입  (0) 2015.11.29
[ Linux ] pwntools, zio 설치  (0) 2015.10.06
Comments