[Lenas Reversing for Newbies] 22
이번 실습에서는 첨부파일인 "API Redirection Tutorial.exe" 언패킹 과정 중 API Redirection으로 인해 망가진 IAT를 복구하는 작업을 한다.
1. 사전 분석
PEiD로 파일을 열어보자.
MoldBox 2.x.x 라는 패커로 패킹되었다. 언패킹을 하기 위해 OllyDbg로 파일을 열어보자.
2. 디버깅(with OllyDbg)
PUSHAD라는 명령어로 시작한다. 언패킹 하는 가장 일반적인 방법을 적용하기 위해 PUSHAD를 실행시키고, ESP에 하드웨어 BP를 설정하고 F9로 실행시켜보자.
체크 표시한 부분의 CALL EAX 명령어를 통해 OEP로 흐름이 넘어갈 것 같다. 해당 부분까지 step in 해보자.
dump 플러그인을 통해 dump를 떠보면 역시 예상대로 프로그램이 실행되지 않는다. ImpRec를 열어보자.
OEP를 맞춰주고, IAT AutoSearch를 한 후, Get Imports로 함수들을 읽어 들였다. 하지만 보이다시피 unresolved pointer가 있다고 나타난다. 무언가 문제가 있다는 뜻이다. Show Invalid 버튼을 눌러 문제가 있는 곳을 살펴보자.
rva : 00038040에 00458C35가 저장되어 있는 것을 확인할 수 있다. 무언가 이상하다. 보통 dll로부터 import 되는 함수들의 주소는 7XXXXXXX로 시작한다. OllyDbg에서 Memory map을 통해 해당 주소가 어느 섹션을 가리키는지 확인해보자.
IAT에 있는 함수 주소가 프로그램의 자기 자신의 영역을 가리키고 있는 것을 확인할 수 있다. 이번엔 OllyDbg의 덤프 창에서 00438040 주소로 이동해보자.
위와 같이 IAT에 대부분 함수들이 제대로 import 되었는데(76XXXXXX로 시작하는 부분) 몇몇 부분에서 0045XXXX 값을 지니는 것을 볼 수 있다. 무언가 언패킹 과정 중 IAT를 조작했음을 유추해볼 수 있다. 프로그램을 다시 시작한 후, 00438040로 부터 4byte만큼의 영역에 하드웨어 BP를 설정하고 실행해보자. 이때 하드웨어 BP에 00458C35라는 값이 write 되는 순간을 포착하기 위해 BP 설정을 write 되는 순간으로 지정해주자.
위와 같이 F9를 몇번 눌러 실행하다 보면 76203FB0이라는 정상적인 dll의 함수 주소가 write 된 것을 볼 수 있다. 하지만 여기서 F9를 한번 더 눌러주면 아래와 같이 다른 값이 덮어 쓰인다.
프로그램을 다시 시작하여 "디버깅 1" 까지 실행시킨 후, F8로 한 줄씩 트레이싱하면서 00438040에 쓰인 값이 바뀌는 순간을 포착해보자.
동그라미 표시한 CALL 명령어가 수행된 직후에 값이 바뀌는 것을 확인할 수 있었다. 함수 내부로 step in 해서 바뀌는 순간을 더 분석하는 방법도 있겠지만, 여기서는 CALL 명령어를 NOP 처리하고 OEP까지 도달한 후, ImpREC로 확인해보았을 때 문제가 발생하는지 확인해보겠다. 우선 다시 실행하여 "디버깅 1"까지 실행한 후, 동그라미 친 부분을 NOP 처리하고 F9를 통해 OEP까지 도달해보자.
실습 영상과는 다르게 Invalid 한 주소가 하나 나타난다. OllyDbg에서 73AB30A0으로 이동해보면 제대로 된 함수인데 인식을 못하는 듯하다. Fix Dump 기능으로 dump 파일을 수정해보고 실행해보자.
위와 같이 정상적으로 파일이 실행되는 것을 확인할 수 있다.
3. Comment
이번 실습은 API redirection에 대한 내용 보다는 하드웨어 BP를 어느 정도로 활용할 수 있는지를 배울 수 있었다. 단순히 access 뿐만 아니라 필요에 따라 write, execution 등 적절한 때에 BP에 걸리도록 설정할 수도 있다.