둘둘리둘둘리둘둘리둘둘리둘둘리둘
[책] Gray Hat Python 소스코드 오류 해결책(작성중) 본문
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 |