<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/tips/3589

            0x00 簡介


            Gh0st是一款非常優秀的開源遠程控制軟件,由紅狼小組的Cooldiyer開發。開源3.6發布后一段時間,作者對其進行大量重寫并發布1.0 Alpha,這個版本是有VIP的,我也有幸收集到一套。 當你拿到一個別人的免殺木馬你想做什么,學習免殺方法?而你由發現你拿到的樣本你手頭的控制端可以完美兼容,你想把配置信息修改了寫個專版生成器嗎?想?那就跟我來吧!(其實你看完文章也不會寫,我也沒有寫過)

            enter image description here

            0x01 分析過程


            本文用到的Ollydbg快捷鍵:

            F9 運行程序/繼續運行
            F8 步過代碼,遇到CALL容易跑飛建議少用
            F7 跟進,不容易跑飛程序。
            F2 下斷點,然后F9可以跳過一些代碼段。
            F4 執行到所選行,常用。
            

            想寫生成器嗎,前提條件要先把配置信息加密解密算法給解了,這里我從服務端exe入手,就不從生成器上下手了,畢竟我們多數情況只有服務端exe樣本。

            enter image description here

            注意看生成器下面“GH0STC+用戶配置信息+GH0STC”,這就是我們要解密的字符串。假如我們現在才抓到服務端exe怎么找配置?一般情況能直觀快速找到的,1、寫在資源文件里面 2、寫在exe、dll尾部附加數據上。(我寫DRAT的時候這兩種都試過),我們用C32ASM工具16進制編輯。拖到最后發現文件尾部有配置信息。大家是否覺得有點簡單…… 難的篇幅太大不在本文考慮范圍內。

            enter image description here

            下面我們用動態調試工具Ollydbg打開,設置CreateFileW函數斷點,這里我用工具直接設置,你也可以使用bp CreateFileW命令設置。為什么要這么做?它要讀取自身配置肯定要“打開自己”所以斷點設置在這個函數最合適,當然也有其他方法不在本文討論范圍,然后按F9把程序運行起來。

            enter image description here

            enter image description here

            如上圖所示的時候(如果不是的話繼續按F9),我們按ALT+F9返回程序,按幾下F8向下走。看到ReadFile函數還有CloseHandle、字符GH0STC,這個時候就說明程序已經把“配置”讀取完了,正常情況下應該準備進入解密了。所以下面出現的CALL調用都要非常注意(一般要按F7進入,不要再按F8了可能會跳過關鍵)

            enter image description here

            看到這個CALL,我們用F7跟進,然后按多個F8直到下一個CALL。

            004015F3  |.  E8 88FEFFFF   CALL server.00401480
            n……
            ……
            ……
            

            enter image description here

            enter image description here

            看到關鍵算法CALL(00401527,至于怎么判斷的我只能說我事先做過功課了,實踐中大家要多試試),我們還是用F7跟進(其他無用部分你可以用F2+F9或F4跳過即可)。

            00401527  |.  E8 B4FEFFFF   CALL server.004013E0
            

            在F7跟入就可以看到

            enter image description here

            00401404  |> /8A1401        /MOV DL,BYTE PTR DS:[ECX+EAX]
            00401407  |. |80EA 08       |SUB DL,8
            0040140A  |. |80F2 20       |XOR DL,20
            0040140D  |. |881401        |MOV BYTE PTR DS:[ECX+EAX],DL
            00401410  |. |41            |INC ECX
            00401411  |. |3BCE          |CMP ECX,ESI
            00401413  |.^\7C EF         \JL SHORT server.00401404
            

            這是解密算法關鍵部分記下地址,我們這里換個工具用IDA看看這個函數(004013E0)。 提示:IDA快速跳轉地址快捷鍵是”G”,

            enter image description here

            轉過去以后我喜歡用F5插件(Hex-Rays Decompiler),這里我直接按F5看C代碼了(這部分操作就不截圖裝B了,事實是也沒什么需要好截的)。

            enter image description here

            對比下OD里面的匯編代碼慢慢品,你會發現關鍵代碼就兩行。

            00401407  |.  80EA 08       |SUB DL,8
            0040140A  |.  80F2 20       |XOR DL,20
            

            有一個字符,減8和異或20的操作。

            for (i = 0; i < len; i++)
            {
                data[i] -= 0x8;
                data[i] ^= 0x20;
            }
            

            到這里我們已經找到關鍵算法部分,你可能沒弄明白還是不知道怎么辦。看下圖的現成工具,實在懶的話自己百度找,或者你找一下gh0st 3.6開源代碼然后差不多的改改就能用來解密了。

            0x02 課后作業


            留下三個作業給喜歡折騰的同學: 1、繼續看下004010D0函數作用(看了沒看明白看下3.6代碼)

            2、對比一下gh0st 3.6加密解密字符和1.0有什么區別(其實最關鍵部分我已經說了,其他都是除了頭尾“GH0STC”不一樣其他沒變化)

            3、寫個配套生成器,還是參考3.6代碼改改就行。

            我這里就不發樣本和其他附件了,有需要的來“暗組”論壇。你想要的這里都有!

            下面在附上1.0字符串解密核心代碼: decode.h

            #!c
            static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
            
            static int pos(char c)
            {
              char *p;
              for(p = base64; *p; p++)
                if(*p == c)
                  return p - base64;
              return -1;
            }
            
            int base64_decode(const char *str, char **data)
            {
              const char *s, *p;
              unsigned char *q;
              int c;
              int x;
              int done = 0;
              int len;
              s = (const char *)malloc(strlen(str));
              q = (unsigned char *)s;
              for(p=str; *p && !done; p+=4){
                  x = pos(p[0]);
                  if(x >= 0)
                      c = x;
                  else{
                      done = 3;
                      break;
                  }
                  c*=64;
            
                  x = pos(p[1]);
                  if(x >= 0)
                      c += x;
                  else
                      return -1;
                  c*=64;
            
                  if(p[2] == '=')
                      done++;
                  else{
                      x = pos(p[2]);
                      if(x >= 0)
                          c += x;
                      else
                          return -1;
                  }
                  c*=64;
            
                  if(p[3] == '=')
                      done++;
                  else{
                      if(done)
                          return -1;
                      x = pos(p[3]);
                      if(x >= 0)
                          c += x;
                      else
                          return -1;
                  }
                  if(done < 3)
                      *q++=(c&0x00ff0000)>>16;
            
                  if(done < 2)
                      *q++=(c&0x0000ff00)>>8;
                  if(done < 1)
                      *q++=(c&0x000000ff)>>0;
              }
            
              len = q - (unsigned char*)(s);
            
              *data = (char*)realloc((void *)s, len);
            
              return len;
            }
            
            char* MyDecode(char *str)
            {
                int     i, len;
                char    *data = NULL;
                len = base64_decode(str, &data);
            
                for (i = 0; i < len; i++)
                {
                    data[i] -= 0x8;
                    data[i] ^= 0x20;
                }
                return data;
            }
            

            gh0st附件

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线