5번 문제는 처음 올리디버거를 이용해서 열어보면 패킹이 되어 있다는 것을 알 수 있다.
그래서 툴을 이용해서 언패킹을 해보았다.
툴을 이용해서 언패킹 해봤다.
이번엔 다른 방법으로 툴을 이용하지 않고 hardware breakpoint를 이용해서 OEP를 찾아봤다.
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 되는 시점에 브레이크가 잡힌다.
hardware breakpoint를 건후 F8을 누르면 위의 화면처럼 OEP의 주소와 함께 그 주소로 점프하라는 코드가 나온다.
OEP로 점프하도록 F8을 눌렀더니 OEP의 코드가 드디어 나왔다!
그 후 스트링을 찾아보았다.
그 중 Wrong Serial,try again!스트링으로 들어가 보았다.
그 중 no name entered 와 No serial entered는 스트링만 봐도 어떤 코드인지 알 수 있다.
serial값에 name을 넣어봤다.
EAX에 name이 들어갔다.
계속 실행해 보니 EDX값에 EAX의 length값이 들어간다는걸 알게되었다.
알아낸 등록키로 등록을 해봤다.
성공!!
'코드 엔진 ' 카테고리의 다른 글
코드엔진 basic 6번 (0) | 2017.12.29 |
---|---|
코드엔진 베이직 3번 (0) | 2017.11.29 |
코드엔진 베이직 2번 (0) | 2017.11.29 |
코드 엔진 베이직 1번 (0) | 2017.11.29 |