Lena's Reversing for Newbie 22 Write-Up
파일 링크: https://tuts4you.com/e107_plugins/download/download.php?list.17
Downloads / Lenas Reversing for Newbies - Tuts 4 You
tuts4you.com
Tutorials Index: 22. API Redirection
사용도구: 올리디버거 2.01
Lena's Reversing for Newbie 22(이하 원본파일) 분석해보자.
원본파일을 실행하면 위와 같다. Name, Key 값을 입력하여 등록하는 프로그램인데 패킹되어 있다.
프로그램 결과 값들은 위와 같다.
올리디버거로 실행하면 PUSHAD 명령어로 레지스터를 백업하기 때문에 언패킹이 진행된 후에 레지스터 값을 복구할 것이다.
따라서 PUSHAD 명령어를 수행하고 ESP 값에 하드웨어 브레이크 포인트를 설정하자.
그럼 위와 같이 OEP로 점프하기 전에 중지된다.
OEP로 추정되는 곳을 보면 함수 프롤로그가 있다.
언패킹한 코드를 덤프하기 위해 OllyDumpEx 플러그인을 이용한다.
IAT를 복구하기 위해 Import REC 도구로 원본파일을 올리고 OEP 331B8 주소를 입력한다. 그리고 AutoSearch 버튼을 클릭하고 Get Imports 버튼을 클릭하면 사용되는 dll들을 확인할 수 있다. 일부 dll의 valid 값이 NO 값이기 때문에 정확한 주소를 복구해야 한다.
첫 번째 NO 값을 가지는 dll 함수의 값은 0x00458C35이다.
해당 주소는 SFX 영역이다.
원본파일을 실행하고 해당 주소를 보면 위와 같은 함수가 있다.
원본파일을 실행하지 않고 다시 확인해보면 아무 값들이 없는 것으로 보아 언패킹이 진행되면서 설정되는 것 같다.
0x00438040 주소의 값이 어떻게 설정되는지 확인하기 위해 하드웨어 브레이크 포인트를 설정한다.
그리고 실행하면 0x004536A6 주소에서 중지된다. 점프한 후에 EDX 레지스터의 값에 따라서 0x004536F8 주소로 점프한다.
0x00438040 주소의 값일 때는 0x004536F8 주소로 점프하지 않고 0x004536F0 주소의 CALL 명령어에 의해 0x00453E90 함수가 호출된다.
0x00453E90 함수를 호출하면 0x00438040 주소의 데이터가 바뀌게 되는 것을 확인할 수 있다. 패커에 의해 IAT가 정상적으로 복구되지 않는 것이다.
따라서 위와 같이 호출 부분을 NOP 명령어로 패치하면 된다.
그리고 실행하면 IAT가 정상적으로 복구되는 것을 확인할 수 있다.
라고 생각했지만 Import REC 도구로 확인해보니 몇 가지 함수의 주소가 정상적으로 복구되지 않았다. 복구되지 않는 함수들이 어떤 것들인지 알아냈지만 IAT를 복구하는 과정에서 패커에 의해서 복구되지 않는 것인지 아니면 실습 환경에 의해 복구되지 않는 것인지는 알아내지 못했다.
*이 문제에 대해 아시는 분은 댓글로 알려주시면 감사합니다.