레이블이 디버깅인 게시물을 표시합니다. 모든 게시물 표시
레이블이 디버깅인 게시물을 표시합니다. 모든 게시물 표시

2012년 8월 28일 화요일

악성코드 분석 - Bundestrojaner [4]




트로이 목마 악성코드를 분석한 과정과 결과를 정리하려고 합니다.








winsys32.sys 파일을 생성하는 함수를 빠져 나오면



 LoadLibrary 함수를 통해 advapi32.dll를 로드하며



CreateService 함수의 주소를 획득하는 명령어가 나타납니다.

CreateService 함수는 advapi32.dll에 포함되어 있으며,




이 함수를 통해 winsys32.sys라는 서비스를 생성합니다.



이 함수를 빠져 나오면 winsys32.sys의 Filetime을 mfc422.dll의 FileTime으로 변경합니다.

이것 또한 분석가를 혼란스럽게 만들기 위한 작업니다.



이후 Skype, SkypePM 등의 파일을 실행하며 스카이프와 관련된 작업을 하는것 처럼 보입니다만

정확한 분석은 하지 못했습니다.


skype 문자들을 넘기고 나면 403FE5에서 4017C0으로 이동해



시스템의 Temp 디렉토리에 접근하고, ~acrd~tmp.exe 라는 새로운 파일을 만듭니다.

이 파일이 어떠한 작업을 하는지 알 수 없지만 나중에 다시 분석해 볼 생각입니다.



마지막으로 기존의 악성코드 파일은 MoveFileExW 함수를 통해 자기자신을 삭제됩니다.



그 후 ExitProcess 함수 호출로 프로세스를 종료하게 됩니다.




Bundestrojaner이 정확하게 어떤 활동을 하는지는 분석하지 않았지만

Dropper인 secuinist.exe가 어떤 함수를 통해 어떤 파일을 만들며

악성코드 제작자가 분석을 어렿게 하기 위해 몇가지 트릭을 설치해 놓은것까지 확인할 수 있었습니다.
다음번엔 Bundestrojaner가 어떻게 타겟의 정보를 획득하고

서버로 전송하는지에 대한 분석을 진행하도록 하겠습니다.


참고 : http://resources.infosecinstitute.com/german-trojan/


악성코드 분석 - Bundestrojaner [3]






트로이 목마 악성코드를 분석한 과정과 결과를 정리하려고 합니다.








이제 GetSystemDirectory 함수를 통해 시스템 디렉토리 정보를 얻고 동적 분석에서 확인했던 파일들을 만들기 시작합니다.


분석하시다 보면 4010F0에서 파일을 생성하는 CreateFile 함수를 통해



동적 분석에서 확인한 C:\Windows\System32\mfc42ul.dll 파일을

생성하는 것을 확인하실 수 있습니다.

지금 만들어진 mfc42ul.dll은 빈 파일로, 4010CF 함수에서 파일 내용이 채워집니다.


조금 더 내려가면 403EC4에서 함수 401E60이 Call 되며 이때 mfc42.dll와 mfc42ul.dll이 스택에 저장되어 전달됩니다.

mfc42.dll은 System32 폴더에 존재하는 윈도우즈 dll이며, mfc42ul.dll은 악성코드가 만든 파일 이름입니다.


함수 401E60에서는 401DC0로 Call이 발생하며



여기서 GetFileTime 함수를 통해 mfc42.dll의 Filetime 정보를 얻습니다.


이제 00401E10 함수에서



함수 SetFileTime을 통해 mfc42ul.dll의 파일시간이 방금 얻은 mfc42.dll의 FileTime으로 변경됩니다.


setFileTime 함수가 실행되기 전에 system32 폴더에서 확인하면 Data Modified 시간이 다르지만


setFileTime 함수 실행 후  Data Modified 시간이 같은 것을 확인할 수 있습니다.

이러한 기법을 사용해서 포렌식에서 새로 만들어진 파일을 찾기 어렵게 만듭니다.



다시 F8을 통해 명령어를 분석하다 보면 403F0E에서 OllyDbg의 코멘트 winsys32.sys를 보실 수 있습니다.

악성코드 제작자는 종종 이런 코멘트를 통해 악성코드 분석가의 관심을 다른곳으로 돌려

잘못된 코드 분석을 유도하기도 하지만, 이 경우엔 그렇지 않았습니다.



여기서 조금 내려가면 403F37에서 4011C0으로의 함수 Call이 있으며 여기서 isWow64 함수를 통해

프로세스가 32비트 환경에서 실행되는지 64비트 환경에서 실행되고 있는지를 확인합니다.


다음은, mfc42ul.dll의 경우 처럼 winsys32 파일을 생성하는 함수가 호출되며



호출되는 과정에서 403F49에서 Call이 실행되고 계속 step into 하면 401160 에서 32비트 환경에서

만들어진 프로그램을 64비트 환경에서 실행하기 위해 리다이렉트되는 것을 막는 함수가 보입니다. (정확하지 않음)

이 과정은 winsys32.sys가 32비트 혹은 64비트 환경에서만 작동하는 드라이버이기 때문에 발생하고 있는것 같습니다.

이 과정은 악성코드의 작용과는 별 상관이 없으므로 넘어가도록 하겠습니다.



계속 명령어를 넘기다 보면 CreateFile 함수 Call이 일어나며 System32 폴더에 빈 winsys32.sys 파일을 만듭니다.


위의 사진은 system32 폴더에 생성된 winsys32.sys 파일입니다.



mfc42ul.dll 의 내용을 채울때 처럼 WriteFile 함수를 통해서 winsys32.sys 파일의 내용을 채웁니다.



악성코드 분석 - Bundestrojaner [4] :


악성코드 분석 - Bundestrojaner [2]





트로이 목마 악성코드를 분석한 과정과 결과를 정리하려고 합니다.





정적 분석은 디버깅 프로그램을 이용해 진행됩니다.




먼저 IDA PRO로 악성코드를 로드해 보면 304개의 함수가 사용되었다는 것을 확인하실 수 있습니다.

따라서 모든 함수를 분석하는 것은 불가능하며, 단지 악성코드가 무엇을 하는가에 초점을 맞춰 분석할 것입니다.



이제 OllyDbg로 악성코드를 로드하면 엔트리 포인트 404EDD에서 코드가 시작됩니다.

F8키를 누르면 다음 명령어로 넘어가게 되고, Call 명령어가 있을 때 F7을 누르면 Call 된 함수 안으로 들어가게 됩니다.



조금만 내려가면 익숙한 윈도우 함수 Kernel32.GetVersion 의 Call을 보실 수 있습니다

악성코드는 가장 먼저 운영체제 시스템 버전 정보를 확인하는것을 확인할 수 있습니다.



그리고 나선 Kernel32.GetCommandLine 함수의 Call을 보실 수 있습니다.

참고로 GetCommandLine 함수는 현재 프로세스의 명령행 인수를 조사해 리턴합니다.




하지만 GetCommandLine 함수 이전에 5개의 Call을 보실 수 있을겁니다.

함수의 구체적인 이름은 나오지 않고 함수의 주소만 나와 있는데,

4061C1, 40500A, 405EAC, 그리고 다시 40500A, 마지막으로 408BC6 의 함수를 Call 합니다.

또한 이 함수들 안에는 또다른 함수들이 있으며, 그 함수들중 알려진 API가 나오기 전에 많은 함수 Call이 있을 수 있습니다.

아까도 말씀 드렸듯이 이 프로그램에는 304개의 함수가 사용되었으며, 모든 함수를 분석하는 것은 매우 힘든 작업입니다.

그래서 여기서는 4061C1, 40500A와 같은 함수 Call 이 나왔을 때 IDA를 이용해 IDA가 분석한 함수 이름을 파악하고

sub_ADDRESS 와 달리 의미 있는 함수 이름을 알려주면, 함수가 어떤 역할을 하는구나 정도만

확인하고 넘어가는 방법을 사용하겠습니다.




IDA를 통해 확인해 보시면 첫번째 함수 4061C1를 제외한 다른 함수들은 IDA가 적절한 이름을 제공해 줍니다.





그래서 4061C1만 F7 키를 통해 분석해 보면 heap 메모리를 할당하는 것을 확인하실 수 있습니다.

heap 메모리를 할당하는 함수는 다른 대부분의 실행파일에서도 확인하실수 있는 함수이며

이 악성코드에서는 별다른 작용을 하지 않습니다.

함수의 분석이 끝나면, IDA에서 4061C1 함수의 이름을 heap_alloc 같은 이름으로 바꿔서 분석한 함수의 역할을 기록해 둡니다.

IDA에서 분석한 나머지 함수들의 이름은 다음과 같습니다.

40500A fast_error_exit
405EAC mtinit
408BC6 ioinit

이런 분석 방법은 분석을 지체되지 않게 하며, 결론을 빠르게 낼 수 있도록 도와줍니다.





다시 GetCommandLineA 함수로 돌아와서 분석을 계속합니다.




다음에 나온 함수는 GetStartupInfoA (404F8E) 와 GetModuleHandle (404FB1) 입니다.

이 함수들을 통해 프로그램의 진짜 시작위치에 근접했다는 것을 아실 수 있습니다.




하지만 그 다음 두개의 함수를 Call하고나서 프로그램이 종료되는것을 확인하실 수있습니다.



IDA에서 403D50와 4080AE의 함수 이름을 확인해 보시면 각각 WinMain과



 __exit 함수라는 것을 확인하실 수 있습니다.

이렇게 IDA를 통해 함수의 이름을 확인하실 수 있기에 저는 IDA를 자주 이용합니다.

꼭 IDA 사용법을 공부하셔서 더 많은 것을 얻으시길 바랍니다.

따라서 403D50이 이 프로그램의 진짜 시작이며 모든 프로그램의 시작인 WinMain 함수를

Call한다는 것을 확인하실 수 있습니다.

이젠 403D50에서 F7을 눌러 Step Into 합니다.

Step Into를 하고 나면 바로 403A20 함수를 Call 하는 것을 확인 하실수 있습니다.

403A20 함수에서 악성코드는 System32 디렉토리에 Write 할 수 있는지를 확인하고 가능하지 않다면 프로세스를 종료합니다.




Wirete 여부의 확인은 CreateFileA 함수의 리턴값을 통해 확인합니다.

여기서 리턴값은 00000030 이므로 파일이 만들어진 것을 확인하고 프로세스를 종료하지 않습니다.




이후 Write 여부 확인을 위해 만든 파일( C:\WINDOWS\system32\~pgp~.tmp )을 지우는 것을 확인하실 수 있습니다.

따라서 동적 분석에서 확인했던 C:\WINDOWS\system32\~pgp~.tmp 파일을 만든 이유를 여기서 확인하실 수 있습니다.


악성코드 분석 - Bundestrojaner [3] :

http://carpedm20.blogspot.kr/2012/08/bundestrojaner-3.html


참고 : http://resources.infosecinstitute.com/german-trojan/


2012년 8월 27일 월요일

악성코드 분석 - Bundestrojaner [1]




트로이 목마 악성코드를 분석한 과정과 결과를 정리하려고 합니다.





먼저 트로이 목마란 정상적인 기능을 하는 프로그램으로 가장해 다른 프로그램 안에 숨어 있다가

그 프로그램이 실행될 때 자신을 활성화 하는 악성 프로그램을 말합니다.

자기 자신을 복사하지 않는다는 점에서 바이러스와는 다른 특성을 나타냅니다.



분석할 트로이 목마는 Bundestrojaner 로 독일 정부가 감시 목적으로

개발한 악성코드라고 알려져 있습니다.



악성코드의 파일명은 scuinist.exe 입니다.

참고로 scuinis는 Skype Capture Unit Installer의 약자이며, Skype Capture Unit은

DigiTask라는 회사에서 개발한 상업적 악성 프로그램의 이름이었습니다.

DigiTask는 독일에 본사를 두고 있으며, The German Customs Investigation Bureau

(독일 소비자 조사국)에서 감시 서비스를 2백만 유로에 매입했다고 합니다.

이와 관련된 정보는 http://www.f-secure.com/weblog/archives/00002250.html

를 참고하시기 바랍니다.



Bundestrojaner는 합법적인 소프트웨어 업데이트로 가장하고, 스카이프 전화 기록,

인터넷 사용 정보, 메신저 대화 내용, 키 입력 등을 기록할 수 있습니다.

또한 마이크와 웹캠과 같은 하드웨어를 활성화 시킬 수 있으며, 사진을 찍거나,

음성을 녹음해 서버로 전송합니다.




아래의 악성코드 분석을 이해하기 위해서는 어셈블리, 리버싱에 대한 기본 지식을 필요로 합니다.


분석 환경은 Windows XP service pack 2 이며 VMware 가상머신을 사용했습니다.

먼저 동적 분석에 사용된 툴은 Sysinternals Autoruns, Regshot, Process Explorer,

Process Monitor, CaptureBat, Wireshark 입니다.

각 프로그램의 간략한 소개를 먼저 드리겠습니다.


Autorun : 윈도우 운영체제의 모든 시작 프로그램을 관리할 수 있는 프로그램

RegShot : 레지스트리의 변경 사항을 확인할 수 있는 프로그램

* 레지스트리 : 모든 윈도우의 설정값과 윈도우에 설치된 응용 프로그램의 설정값을 저장하는 데이터 베이스

Process Explorer : 현재 실행중인 프로세스의 상세한 정보를 확인할 수 있는 프로그램입니다.

Process Monitor : 프로세스, 레지스트리, 파일 시스템, 네트워크의 활동을 모니터링 할 수 있는 프로그램입니다. (low level)

CaptureBat : 프로세스 모니터와의 기능이 유사하며, 악성코드가 하드 디스크에서 지운 파일을 저장해 둡니다. (high level)


악성코드를 실행하고 나면, 위의 도구들을 통해 동적 분석을 할 수 있습니다.


악성코드를 실행하기 전의 상태를 regshot, autorun, winalysis 등을 통해 모두 저장해 둡니다.

동적 분석을 시작할 준비가 되면 악성코드를 실행하고 CaptureBat과 Process Monitor로

악성코드가 어떤 활동을 하는지를 기록합니다.



위의 그림은 악성코드를 실행하고 악성코드의 활동을 켑쳐한 후의 사진입니다.

여기서 악성코드가 실행되고 나서 자기 자신을 삭제하는 것을 확인하실 수 있습니다.


먼저 Winalysis로 시스템의 변화를 살펴보면


위의 사진에서처럼 몇 개의 파일이 생성되었으며, winsys32라는 서비스가 등록된 것을 확인하실 수 있습니다.



Process Monitor에서 불필요한 과정들을 필터로 지우고 중요한 과정을 하이라이트 하면


winalysis를 통해서 확인했던 파일들이 생성된 것을 확인하실 수 있습니다.




CaptureBat의 분석 결과를 통해 low level이 아닌 high level 관점에서 분석하면

위의 파일들이 생성된 것을 확인하실 수 있습니다.

또한 악성코드가 어떤 레지스트리를 등록했는지도 확인하실 수 있습니다.




마지막으로 Autorun에서 winsys32라는 새로운 드라이버가 등록된 것을 확인하실 수 있습니다. 




위의 분석 결과를 종합해 보면 악성코드는 실행된 후 dll파일과 sys 파일을 윈도우 시스템 폴더에 생성합니다.

생성된 파일들의 절대 경로는 C:\WINDOWS\system32\mfc42ul.dll 와 C:\WINDOWS\system32\winsys32.sys 입니다.


정확한 이유는 모르지만 C:\WINDOWS\system32\~pgp~.tmp 라는 빈 파일을 생성합니다.


또한 Temp 디렉토리에 파일을 복사한 것을 확인하실 수 있습니다.

복사한 파일의 절대 경로는 C:\Documents and Settings\arvind\Local Settings\Temp\~acrd~tmp~.exe 입니다.

아직까지 이 파일들이 정확히 어떤 행동을 하는지는 정확하게 알 수 없습니다.

마지막으로 드라이버로 보이는 키를 레지스트리에 등록하고, 모든 활동이 끝나면 자기 자신을 삭제합니다.


간단히 요약하면, 악성코드 파일은 몇 개의 파일을 하드에 설치하고 레지스트리를 등록하며

설치가 완료되면 자기 자신을 삭제하며, 이외의 다른 행동은 하지 않는 것 같습니다.

이와 같은 행동을 하는 악성코드를 드로퍼(Dropper)라고 부릅니다.

드로퍼란 파일에는 바이러스 코드가 없으나 실행 시 바이러스를 생성하고 시스템을 감염 시키는 악성코드를 말합니다.

이제 정적 분석을 통해 동적 분석 결과를 확인하며, 다른 행동을 하는지 알아볼 것입니다.


악성코드 분석 - Bundestrojaner [2] :

http://carpedm20.blogspot.kr/2012/08/bundestrojaner-2.html


참고 : http://resources.infosecinstitute.com/german-trojan/

2012년 8월 15일 수요일

스타크래프트 시디키 알고리즘 분석 [2]




스타크래프트 오리지널 설치 파일을 리버싱 해서 분석한 내용을 정리한 글입니다.
아직 리버싱을 배우는 단계라 설명과 리버싱 과정에 부족함이 많습니다.
저작권문제가 있을시 삭제하겠습니다.


1. 스타크래프트 시디키 알고리즘 분석 [1]에 이어서 설명하겠습니다.



2. 스타크래프트 시디키 알고리즘 분석 [1]에서 찾은 코드 위를 JMP와 call 중심으로 분석하고

레지스터를 확인해 보면 아래 그림과 같이 EAX 레지스터에 여러분이 입력하신

시디키가 보이는 것을 확인하실 수 있을겁니다.

또한 명령어 코멘트를 보면 ASCII 문자로도 입력하신 시디키가 설치 프로그램에서

사용되고 있다는 것을 아실 수 있습니다.

아래의 코멘트 중 '//'로 시작하는 코멘트는 제가 따로 입력한 코멘트 입니다.



3. 각각의 call 들을 확인하다 보면 아래 그림과 같이 주소 0040F792 에서

알고리즘으로 추측되는 함수를 call 한다는 것을 확인하실 수 있습니다.

여기까지 오는데에는 약간 시간이 걸리실 수 있으며, 꼼꼼하게 확인 하셔야

저 알고리즘 call을 확인 하실 수 있습니다.

귀찮으시더라도 배운다는 마음가짐으로 꾸준히 리버싱을 하시기 바랍니다.



4. 위의 명령어에서 F7 키를 눌러 함수로 들어가면

아래에 선택된 명령어들을 확인 하실 수 있습니다.

알고리즘이 시작되기 전에 스택에 여러가지 함수를 부르고 저장하는 과정을 거치며



5. 조금 내려오시면 시디키 길이를 비교하는 CMP가 나옵니다.

아래의 그림은 제가 임의로 시디키 자릿수를 13자리에서 12자리만 입력한 경우

자릿수가 일치하지 않아 점프가 일어나지 않는 경우를 보여줍니다.

이경우 바로 에러 발생 코드로 넘어가게 됩니다.



6. 그리고 몇가지 레지스터를 PUSH하는 과정이 지나면

몇가지 레지스터를 초기화 하면서 시작하는 알고리즘을 확인하실 수 있습니다.

다시한번 강조하지만 위의  추측 확인 과정을 모두 직접 해 보셔야 리버싱 실력이 늡니다.



7. 이제 여러분이 하셔야 하는 것인 어셈블리를 분석하는 것 입니다.

어셈블리가 무엇을하고 알고리즘이 어떻게 진행되는지에 대한 코멘트는

아래 사진을 통해 보실 수 있습니다.



제가 위의 알고리즘을 나름 정리한 건데, 보시는것처럼 알고리즘이 지극히 단순합니다.

간단히 요약하면 시디키 13자리중 앞의 12자리가 마지막 자릿수를 확인하는

알고리즘임을 알 수 있습니다.

다시말해, 앞의 12자리는 임의의 수를 넣고,

마지막 자릿수만 0부터 9까지의 숫자로 바꾸면 시디키를 만들 수 있습니다.

마지막 자릿수를 비교하고, 점프하는 부분을 바꿔주시면

어떤 수를 넣든 항상 시디키를 인증해 주는 설치파일을 만들 수도 있습니다.




이 과정을 모두 거치시고 알고리즘을 이해하셨다면 여러분은

시디키 생성 프로그램도 만드실 수 있을 겁니다.

전체 코드는 올리지 않게겠지만, 제가 짠 코드의 핵심 알고리즘 부분만 남기며 글을 마치겠습니다.

부족한 점이 있다면 댓글로 지적해 주시면 감사하겠습니다.

또한 저작권 문제가 있을 시 삭제하겠습니다.

=============================

void generator() {

int eax=3, edx=0, edi, lastnumber;
int serial[12];

for(int i = 0; i < 12; i++)
serial[i] = rand()%10;

for(int i = 0; i < 12; i++) {
edi = eax ^ (eax * 2);
eax += edi;
}
lastnumber  = eax % 10;
}


=============================