Practical Malware Analysis 9-3
실습 9-3
실습 환경 : Vmware (Windows 7 32 bit)
사용한 툴 : IDA Free, Ollydbg
IDA를 사용하여 프로그램을 열어 임포트 테이블을 살펴보면
NetApi32.dll, kernel32.dll, DLL1.dll, DLL2.dll을 담고 있는 것을 확인할 수 있다. 어떤 dll이 실행중 동적으로 로드되는지 확인하기 위해 LoadLibrary 호출을 검색해보면
DLL3.dll과 user32.dll을 확인할 수 있다.
이제 PE View를 사용하여 DLL파일들의 베이스 주소를 살펴보면
모두 동일한 ImageBase 주소인 0x10000000임을 확인할 수 있었다.
이제 Ollydbg를 사용하여 프로그램이 실행중 로드된 DLL들의 위치를 Memory Map을 사용하여 살펴보면
DLL1.dll이 먼저 0x10000000에 있음을 알 수 있고 DLL2.dll은 DLL1.dll이 자신의 베이스 주소에 위치하므로 0x1D0000에 로드 됬다. DLL3.dll은 0x310000에 로드되어 있다.
이제 분석을 계속 진행해보면
00401006에서 DLL1print 호출을 볼 수 있는데 이를 분석해보면
DLL 1 mystery data %d를 출력하는 것을 확인할 수 있는데 이를 IDA를 사용하여 살펴보면
dword_10008030 값이 %d 값인 것을 확인할 수 있는데 이 값은
GetCurrentProcessId 함수를 사용하여 현재 프로세스의 프로세스id를 가져온다는 것을 확인할 수 있었다.
즉 현재 프로세스의 프로세스id를 가져와 DLL 1 mystery data 프로세스id 형식으로 출력하는 것을 확인할 수 있었다.
계속해서 분석을 진행해보면 위에서 DLL2print와 DLL2ReturnJ를 볼 수 있다. IDA를 사용해 DLL2.dll을 분석해보면
DLL2Print가 DLL 2 mystery data %d를 출력하는 것을 확인할 수 있는데 %d 값을 살펴보면 dword_1000B078인 것을 확인할 수 있고 이를 분석해보면
CreateFile 함수를 통해 오픈한 temp.txt 파일의 핸들 이라는 것을 확인할 수 있다. 만약 파일이 없을 경우 함수는 파일을 생성한다.
이제 DLL2ReturnJ를 살펴보면
eax에 temp.txt 파일 핸들 값을 반환하는 것을 확인할 수 있다.
계속 분석해보면 위에서 WriteFile 함수 호출을 볼 수 있는데 입력 받는 파라미터들을 살펴보면 DLL2ReturnJ를 통해 반환받은 temp.txt 파일의 핸들을 사용하여 offset 406060에 있는 문자열인 malwareanalysisbook.com을 작성하는 것을 확인할 수 있다.
분석을 진행해보면 LoadLibrary 함수를 사용해 DLL3.dll을 호출하고 GetProcAddress 함수를 이용하여 DLL3Print와 DLL3GetStructure를 동적으로 호출하는 것을 볼 수 있다.
이제 DLL3.dll을 IDA를 사용해 DLL3Print를 살펴보면
DLL 3 mystery data %d를 출력하는 것을 확인할 수 있고 DLLMain을 살펴보면
문자열 ping www.malwareanalysisbook.com을 유니코드 문자열로 변환시키는것을 확인할 수 있고 %d의 값은 유니코드로 변환시킨 문자열의 메모리 위치임을 확인할 수 있었다.
계속해서 DLL3GetStructure를 살펴보면
dword_1000B0A0의 포인터를 반환하는 것으로 보이는데 어떤 데이터가 있는지 알 수 없지만 DLLMain을 살펴보면 어떠한 구조체를 설정하는 것으로 보인다. 이제 이 구조체의 내용을 알기 위해 Lab09-03.exe를 살펴보면
DLL3GetStructure를 호출하여 그 결과 값인 Buffer가 가리키는 구조체를 NetScheduleJobAdd로 전달하는 것을 볼 수 있고 MSDN에서 찾아보면 이 구조체는 AT_INFO구조체임을 확인할 수 있었다.
[01] Lab09-03.exe를 통해 어떤 DLL이 임포트되는가?
위에서 임포트 테이블을 살펴보면 DLL1.dll, DLL2.dll, kernel32.dll, NetApi32.dll이 있는것을 확인할 수 있고 동적으로 user32.dll, DLL3.dll을 로드한다.
[02] DLL1.dll, DLL2.dll과 DLL3.dll이 요청하는 베이스 주소는 무엇인가?
3개의 DLL 모두 동일한 베이스 주소인 0x10000000을 요청한다.
[03] Lab09-03.exe를 디버깅하기 위해 Ollydbg를 사용할 때 DLL1.dll, DLL2.dll과 DLL3.dll을 위해 할당하는 베이스 주소는 무엇인가?
DLL1.dll은 0x10000000에 DLL2.dll은 0x1D0000에 DLL3.dll은 0x310000 위치에 로드된다. (사용하는 장비마다 다를 수 있다.)
[04] Lab09-03.exe가 DLL1.dll에서 임포트 함수를 호출할 때 해당 임포트 함수는 무엇을 하는가?
DLL 1 mystery data %d(현재 프로세스의 프로세스id)를 출력한다.
[05] Lab09-03.exe가 WriteFile을 호출할 때 쓰려는 파일의 이름은 무엇인가?
tmpe.txt 파일이다.
[06] Lab09-03.exe가 NetScheduleJobAdd를 사용해 잡(job)을 생성할 때 두 번째 파라미터를 데이터의 어디에서 구하는가?
DLL3GetStructure에서 버퍼를 동적으로 알아낸다.
[07] 프로그램을 실행하거나 디버깅하는 동안 프로그램이 3 조각의 mystery data를 출력함을 알 수 있다. 무엇인가?
첫 번째는 현재 프로세스 id이고 두 번째는 temp.txt 파일을 오픈한 핸들이고 세 번째는 문자열 ping www.malwareanalysisbook.com의 메모리 위치이다.
[08] Ollydbg에서 사용하는 로드 주소와 일치하게 IDA Pro로 DLL2.dll을 어떻게 로드할 수 있는가?
DLL을 로딩할 때 Manual Load를 선택한 후
Please specify the new image base 필드에 새로운 베이스 주소를 입력한다.