Simple Reverse - 0x16(2023 Lab - WinMalware - sub_140001C80)

Simple Reverse - 0x16(2023 Lab - WinMalware - sub_140001C80)

Description

分析 eductf-lab.exe 中的 function sub_140001C80 在做什麼,並找出其行為所對應的 MITRE ATT&CK technique ID。 Flag format: FLAG{T1234.001}

Background

Source code

  • Main Function
    1
    2
    3
    4
    5
    6
    7
    8
    9
      int __cdecl main(int argc, const char **argv, const char **envp)
      {
        Sleep(0x1B7740u);
        sub_140001C80();
        sub_140001030();
        sub_140001120();
        sub_140001BF0();
        return 0;
      }
    
  • sub_140001C80 :::spoiler IDA Source Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
      DWORD sub_140001C80()
      {
        DWORD result; // eax
        size_t v1; // rax
        DWORD v2; // [rsp+20h] [rbp-258h]
        const CHAR *lpNewFileName; // [rsp+28h] [rbp-250h]
        DWORD pcbBuffer[4]; // [rsp+30h] [rbp-248h] BYREF
        CHAR Buffer[272]; // [rsp+40h] [rbp-238h] BYREF
        CHAR Filename[272]; // [rsp+150h] [rbp-128h] BYREF
    
        result = GetModuleFileNameA(0i64, Filename, 0x104u);
        v2 = result;
        if ( result )
        {
          result = GetUserNameA(Buffer, pcbBuffer);
          if ( result )
          {
            v1 = pcbBuffer[0] + v2 + 100;
            if ( __CFADD__(pcbBuffer[0], v2 + 100) )
              v1 = -1i64;
            lpNewFileName = (const CHAR *)malloc(v1);
            sub_140001350(
              lpNewFileName,
              v2 + pcbBuffer[0] + 100,
              "C:\Users\%s\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\SecurityUpdateCheck.exe",
              Buffer);
            result = CopyFileA(Filename, lpNewFileName, 0);
            if ( result )
              return SetFileAttributesA(lpNewFileName, 0x26u);
          }
        }
        return result;
      }
    

    :::

Recon

:::spoiler IDA sub_14001C80(解析版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
DWORD copyfile2startup_setAttribute()
{
  DWORD Result; // eax
  size_t malloc_size; // rax
  DWORD filename_len; // [rsp+20h] [rbp-258h]
  const CHAR *file_new_path; // [rsp+28h] [rbp-250h]
  int username[4]; // [rsp+30h] [rbp-248h] BYREF
  CHAR username_buffer[272]; // [rsp+40h] [rbp-238h] BYREF
  CHAR Filename[272]; // [rsp+150h] [rbp-128h] BYREF

  Result = GetModuleFileNameA(0i64, Filename, 260u);// 取得目前執行程式的名稱
  filename_len = Result;                        // 回傳值為名稱長度
  if ( Result )
  {
    Result = GetUserNameA(username_buffer, username);// 取得使用者名稱
    if ( Result )
    {
      malloc_size = username[0] + filename_len + 100;
      if ( __CFADD__(username[0], filename_len + 100) )
        malloc_size = -1i64;
      file_new_path = malloc(malloc_size);
      sprintf(
        file_new_path,
        filename_len + username[0] + 100,
        "C:\Users\%s\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\SecurityUpdateCheck.exe",
        username_buffer);
      Result = CopyFileA(Filename, file_new_path, 0);
      if ( Result )
        return SetFileAttributesA(file_new_path, 0x26u);
    }
  }
  return Result;
}

::: 從解析版中開始由上而下可以知道攻擊者的完整意圖

  1. 取得目前執行程式的名稱和名稱長度
  2. 取得目前執行該程式的使用者名稱
  3. 利用(username_length + filename_length + 100)這個大小取得malloc的空間
  4. 利用sprintf,讓該空間儲存C:\\Users\\{username}\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\SecurityUpdateCheck.exe這個字串
  5. 複製目前這個檔案到上一個file path
  6. 設定新檔案的屬性(備份檔+隱藏檔+系統檔)

根據以上的流程很明顯他要把檔案放到每次開機都一定會執行的資料夾,並且不想讓使用者察覺到該檔案,所有操作都是為了之後或下一次開機的時候仍然能夠持續執行該程式$\to$Persistent

Exploit

從ATT&CK的網站可以看到persistence的子頁面出現autostart其實和目前的狀態最吻合,就看他是用甚麼方法達到該目的,從其中的技巧來看會發現有很多種方法可以達到此效果,例如改變機碼或是改變lsass driver之類的,而我們的技巧被歸類在T1547.001 Att&CK - T1547 Flag: FLAG{T1547.001}