이전에 Windbg로 리버싱하던중 메모리를 뒤져서 원하는 정보를 얻었는데 메모리에 언제 누가 그 정보를 입력하는지가 궁금해서 엄청 노가다를 해서 알아냈던 기억이 있습니다. 이때 하드웨어 브레이크포인트를 알았더라면..ㅠㅠ
일단 Windbg와 OllyDbg 두가지 경우를 정리하겠습니다.
먼저 OllyDbg로 OEP를 찾는 방법입니다.
1. OllyDbg
약간의 패킹에 대한 기본지식이 필요하지만 일단 정리하는 차원이라 간단히 설명드리겠습니다. UPX를 이용하여 패킹을 한 실행파일을 실행을 하면 PUSHAD 명령어로 시작을 하게 됩니다. UPX 패커의 특징입니다.
PUSHAD : 8개의 범용 레지스터(EAX~EDI)의 값을 스택에 저장
POPAD : 8개의 범용 레지스터(EAX~EDI)의 값을 스택에서 빼서 레지스터에 적용
UPX를 가지고 패킹을 하면 패킹된 실행파일은 처음 실행될때 바로 패킹하기전 EP(OEP)로 시작하지 않기 때문에 해당 레지스터의 값들을 그대로 스택에 저장했다가 EP에 왔을때 POPAD를 통해 레지스터 복원을 해주고 있습니다. 하여 PUSHAD를 통하여 스택에 저장된 데이타를 언제 ACCESS하는지 잡으면 쉽게 EP로 가는 곳을 잡을 수 있습니다.
그림에서와 같이 PUSHAD 실행후 레지스터값이 그대로 스택에 저장이 된것을 볼 수 있습니다. 그리고 DUMP 창에서 팝업메뉴에 있는 Breakpoint > Hardware, on access > Byte를 선택하면 해당 스택의 데이타가 access 되는 시점에 브레이크가 잡히게 됩니다.
아래와 같이 간단히 사용법만 정리해보았습니다.
2. WinDbg
WinDbg는 ba(break on access) 라는 명령어를 이용하여 메모리 access 시점을 잡을 수 있습니다.
<사용법>
ba [r/w/e][Size] Addr
-r(Read), w(Write), e(Execute)
-Size : 해당 주소로 부터 엑세스를 감지할 메모리 사이즈(1/2/4 bytes)
-Addr : 해당 주소
댓글 없음:
댓글 쓰기