Introduction
우선 2가지 샘플을 받았다. 둘다 32비트 PE 바이너리이며, WinMain함수부터 narrow down 방식으로 분석하겠다.
악성코드 분석 경험 보단 리버싱에 경험이 더 많으므로 먼저 분석 후에 행위에 대한것을 말하는게 좋을것 같다.
두 바이너리 모두 32 bit PE 바이너리이다.
Sample 1
우선 Sample 1이다.

가장 먼저 처음으로 GetModuleFileName 함수로 현재 실행 경로를 리턴받는다.
Filename 변수에는 C:\Users\Phantom\Desktop\Samples\sample1값이 저장되어 있다.
그 후 memset으로 VersionInformation 구조체를 초기화하고 dwOSVersionInfoSize 멤버변수에 276을 넣는다. OS Version 정보를 가져오는 것이라는데 자세한건 알아봐야겠다.

GetVersionEx함수로 함수의 버전정보를 가져온다. 그 후 GetWindowsDirectory 함수로 Buffer에 시스템 폴더(C:\Windows)의 경로를 저장한다.


그 이후 v4 변수에 따라 분기하게 되는데 이 값은 위에서 VersionInformation 구조체의 dwMajorVersion이 5일 경우 참으로 설정된다. 그러나 값은 0이기에 else로 분기하여 C:\users\Public\을 memcpy로 복사한다.

그 다음 GetTickCount로 값을 가져온 후 srand함수와 rand함수로 난수를 생성해 그 값이 알파벳인 5자리 문자를 생성해낸다.

내 경우는 RSmEa 였다. 그 뒤로 .exe를 붙여 RSmEa.exe라는 문자열을 만든다. 그 후 위의 경로와 합쳐서 "C:\users\Public\RSmEa.exe라는 문자열을 만들고 CreateFile함수로 파일을 만든다.

그 이후 kernel32.dll안의 IsWow64Process의 핸들 값을 받아온 후 GetCurrentProcess함수를 통해 현재 프로세스의 핸들 값을 얻어온다.

그 이후 kernel32.dll은 Free하며 v43에 따라 분기하여 어떤 값을 쓰는데 살펴보니 PE Header값이였다. 아마 32bit PE와 64bit PE+로 나누어 쓰는것 같다. 이 부분을 떼어보니 위의 것이 64bit PE+이다.

최종적으로 ShellExecute 함수로 RSmEa.exe 바이너리를 실행한다.
sample1 이후 WinMain에서 확인하지 못한 현상들이 발견되었다.
RukeREADME.txt 파일이 생성되었으며 다른 바이너리들이 암호화되었다.
sample1_part
해당 부분을 HxD로 덤프하여 exe파일로 만든 것을 다시 분석해보도록 하겠다.
우선 Sleep 이후 CommandLine을 Get해오고 다시 매개변수 별로 CommandLine을 분리한다.

그 후 파일 경로를 지우고 Free한다.

그 이후 v7에 VersionInformation 구조체 주소를 넘기고 VersionInformation 정보를 채운다음 GetVersionEx 함수로 버전정보를 불러온다.

그 이후 사용자 함수 안에서 Window 디렉토리를 불러온 후 "System32\cmd.exe" 문자열을 Buffer에 memmove함수를 통해 붙인다.

그 다음 사용자함수를 실행하는데 이 함수는 Sample1에서 분석했던 kernel32.dll을 Load하고 IsWow64Process의 주소를 Get해온후 현재 프로세스의 주소를 구한다음 Free하는 부분과 같은 내용이다.
그 다음 GetModuleFileName함수로 현재 exe의 실행 경로("C:\Users\Phantom\Desktop\Samples\sample1_part.exe")를 얻어온다.


C:\Windows\System32\cmd.exe /C REG ADD "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "svchos" /t REG_SZ /d "C:\Users\phantom\Desktop\Samples\sample1_part.exe" /f
최종적으로 문자열 연산을 통해 cmd로 레지스트리 명령을 실행하는 ShellExecute함수를 실행하게 한다.

그 이후 TokenHandle을 이용해 쓰레드의 권한을 조정한 후 힙으로 해당 쓰레드를 실행한 후 Free한다.

이후 굉장히 복잡한 코드가 실행되는데 핵심 부분인것으로 보인다. 프로그램 흐름대로 분석해보겠다.

GetModuleFileName함수 이후 모든 프로세스를 Search 하여 sample_part 프로세스와 비교하여 찾으면 sample_part 프로세스를 Alloc→Execute→Free한다.
그리고 마지막에 C:\users\Public에 sys파일을 만들고 프로그램을 종료한다. csrss.exe, explorer.exe, lsaas.exe 프로세스가 나오면 예외로 처리하는것 같다.
분명 어디선가 README파일과 암호화를 하는것 같은데 그 로직을 찾지 못했다.
Sample2
Sample1에서 하지 않은 암호화를 여기서 하는것 같다.
이 바이너리 역시 WinMain을 기준으로 간단히 보자면 우선 IP가 노출되어있고 검색해보니 랜섬웨어였다. 물론 프로그램을 테스트 실행했을 때 Ryuk 라는 문자열을 계속 볼 수 있었는데 ESTsecurity 블로그에서는 Hermes 랜섬웨어의 변종이라고 한다. 분석해보니 Sample2가 메인 바이너리였다.


sub_403FB0 함수가 정확히 어떤함수인지는 모르겠으나 이 내부함수에서 필요한 DLL과 Library들을 미리 저장하여 GetProcAddress함수로 몇몇 모듈은 호출하여 사용하는것 같다.

그리고 그 다음 함수에서 배치파일과 winlogon.exe를 만든 후에 exit로 프로그램이 강제 종료되게 된다. 물론 이후 과정은 이 부분을 분기한 후 이뤄질 것으로 판단된다. 이 부분에서 동적으로 분석하는데 상당히 애를먹었다.
이후 코드에서 암호화 하는 부분이 존재했다.



xor로 바이트를 만들어서 하는것은 알겠는데 정확히 어디에 이것을 사용하려 하는것인지는 잘 모르겠다. 그리고 그 다음 함수에서 암호화 하는것 또한 무엇을 암호화하는지는 아직 파악이 안됐다.

또한 vssadmin(볼륨 새도우 카피) 를 통해서
"vssadmin Delete Shadows /all /quiet" 로 모두 조용히 지우는 작업을 수행한다. 이 명령어를 검색하면서 알게된 사실인데 이 명령을 실행할 경우 백업파일이 전부 날라가게 된다고 한다.

마지막으로 링크? 같은 것을 만들어서 README 파일을 띄우는 것으로 보인다.
Conclusion
정리하자면 Sample1과 Sample2는 직접적으로 파일 이름을 명시하여 연결되어있는것은 아니다.
실제 암호화를 수행하고 파일을 생성하는것은 Sample2이며 Sample1이 운영체제 버전에 맞게 악성코드를 실행할 수 있게끔 서포트해주는 바이너리로 보인다. Sample2는 상당히 복잡했기에 분석에 어려움이 있었다. 그리고 Sample1은 바이너리 안에 바이너리가 있어서 신기했다.