본문 바로가기

모의해킹/리버싱

Import address table 복구 : 레나 챌린지 (Level 21)

728x90

PEview툴을 사용해 프로그램의  Import address table을 확인해 보자.

Windows API에 관련된 함수들을 가지고 있다.(Process, dr\aw text, AndPoint..)

 

올리디버그로 보면 GetModuleHandleA인 windows api을 볼 수 있다. 

여기를 통해서 윈도가 할 수 있는 명령어들을 많이 실행한다.

 

GetModuleHandleA에 들어가면 포인터를 가지고 점프를 하는 걸로 보인다.

포인터가 어디인지 보려면 밑에 402000에 저장이 되어 있고. 7080B741이라느 숫자가 저장되어 있다.

Ctrl + G 누르고 402000으로 이동을 해보자.

 

덤프창에서 보면 Import address table이다

PEview툴에서 볼 수 있다. 

결론은 현재 프로그램을 올리디버그에서 볼 때 두 번째 줄에서 GetMoudleA를 호출한다는 사실을 알 수 있다.

 

여기 CALL에서 바로 7C80B741로 콜 때리면 되는걸 왜 굳이 402000에다가 써놓았을까? -> 호환성 때문이다(old version을 업데이트하더라도 프로그램들이 잘 돌아가도록 해주는 것)

 

 하드코딩을 하면 안 되기 때문에 Import table의 주소에 따라 로드되는 시점에 현재의 운영체제에 맞게끔 참조되는 데이터가 바뀐다.

 

* UPX 프로그램을 언패킹 해보자.

더보기
UPX 프로그램

바로 PUSHAD가 나오는 걸 봐서 ESP를 통해서 확인하면 되겠다는 사실을 알 수 있다.

F8로 실행 후, 덤프창에서 esp로 이동을 해준 다음 Dword 브레이크 포인트를 걸어준다.

 

F9로 실행을 하면 건드린 다음 멈추기 때문에 POPAD에서 건드렸다는 사실을 알 수 있다. 그다음 401000으로 점프를 한다.

메모리 영역을 보면  401000은 UPX0부분이다.

F8을 눌러 401000으로 오면 여기가 OEP라고 볼 수 있다. 그 다음 Plugins에서 Ollydump를 실행시켜 덤프를 떠준다.

Import REC툴을 이용해 덤프 된 프로그램에 올바른 improt table을 적용시켜 줄 것이다.

 

사용방법 : 압축이 풀린(정상적인 upx 프로그램을 실행된 상태에서(올리디버그) ) REC툴에 있는 IAT AutoSearch 버튼을 눌러준다. -> OEP을 1000으로 수정해 준다. -> get imports을 눌러준다. -> Fix Dump로 덤프 한 프로그램을 고쳐준다.

 

 정상적으로 실행이 될 것이다. 고치기 전 덤프한 프로그램은 실행이 안된다.