ESP 레지스터 값이 EBP 레지스터에 저장된다.
스택 top(ESP 레지스터가 가리키는 곳)에는 EBP 레지스터 값이 저장되어 있다. 현재 EBP 레지스터에는 EBP 값이 저장된 스택의 주소를 가진다.
언패킹이 끝나면 다시 이전 루틴의 EBP 값을 ESP 레지스터에 가져와서 EBP 레지스터에 저장해야 하므로, ESP 레지스터 값이 가리키는 메모리 주소에 BP를 설정하면 OEP로 이동하는 지점을 확인할 수 있다.
스택 top에 저장된 이전 루틴의 EBP 값에 hardware breakpoint를 설정한다.
x32dbg에서 이전 루틴의 EBP 값이 저장된 스택 top 주소 0019FF70에서 우클릭→ 덤프에서 따라가기 를 선택하면 덤프를 확인할 수 있다.
스택 top에 저장된 EBP 값에 우클릭 → 중단점 → Access(R/W) (데이터를 읽어야 하므로) → Dword (32bit에서 4byte 단위로 데이터 읽으므로)
EIP가 OEP(004271B0)를 가리키고 있을 때, 플러그인 -> Scylla 선택한다.
따로 OEP 설정하지 않아도 EIP가 가리키는 값으로 자동 설정된다.
IAT Autosearch를 누르면 위와 같은 창이 뜨고 IAT Info가 업데이트된다.
그리고 Get Imports 버튼을 누른다.
이후 Dump를 누르면 덤프한 파일을 저장할 수 있다. 디폴트로 원본파일_dump.exe로 설정된다.
Fix Dump를 눌러서 저장한 dump 파일을 불러온다.
그럼 _SCY가 붙은 파일이 생성되고, 최종 실행파일에 해당한다.
이 프로그램의 경우, IAT 복구 없이 프로그램을 실행할 수 있다.
UnPackMe_EZIP1.0_dump.exe를 F9로 실행시키면, OEP인 004271B0에서 실행이 멈추고 EntryPoint라고 표시되는 것을 확인할 수 있다.
리버싱 입문 1.7 리버싱에 필요한 도구 (0) | 2021.05.17 |
---|---|
리버싱 입문 5. 리버싱의 어려운 문제들 (0) | 2021.05.11 |
CodeEngn Basic RCE L10 (0) | 2021.05.10 |
CodeEngn Basic RCE L08 (0) | 2021.05.09 |
CodeEngn Basic RCE L06 (0) | 2021.05.09 |