最近閑來無事搞了一個免殺平台玩兒玩兒,用于生成免殺Cobalt Strike木馬和免殺加載一些其它shellcode(如msf、自定義等),在開發過程中遇到了不少有意思的事情,是以這裡就和大家分享一下這些。

起初做的平台是用CS生成的shellcode去生成免殺馬,後來感覺太過于麻煩,每次生成免殺木馬前都要先去生成shellcode,遂改良了一下,下面講一下我從CS shellcode提取IP&port的思路:
1.首先Cobalt Strike生成C(java、python、perl、C#、ruby都行)的payload:
如上圖所示:生成木馬的IP為172.18.42.63,端口為5555:
修改木馬格式,将木馬修改為16進制格式,形如:<code>0xfc,0x48,0x83,0xe4...</code>:
現在開始正式分析這個payload,将16進制的payload轉換為string類型:
編譯執行可直接找到IP:172.18.42.63,由此可見IP是直接string -> byte放到shellcode裡的,
将IP(string類型):<code>172.18.42.63</code>轉換為byte類型,去鎖定其在shellcode中的位置:
至此,我們就找到了IP,但是端口并沒有找到,翻閱百度、問群友無果後決定換個思路找找看:
5555(端口号)的16進制為15b3:
起初并沒有搜到,以為思路不對,但是在搜0x15的時候發現0xb3在0x15的前面:
會不會是<code>小端模式</code>的原因,端口轉16進制,在shellcode裡的表示正好是反着的?抱着這樣的了解,準備再生成一個6666端口的shellcode驗證一下:
6666的16進制為:1a0a,在shellcode中的表示為0x0a, 0x1a,正好是反着的,驗證了我們的想法,至此IP和端口就都找到了。
這裡普及一下小端模式和大端模式:
小端模式:是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中。
簡單的說就是低位址存低位,高位址存高位:
為了友善說明,使用16進制表示這兩個數,即0x12345678和0x11223344。小端模式采用以下方式存儲這個兩個數字:
大端模式:是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中。
簡單的上,就是低位址存高位,高位址存低位(跟人讀寫數值的順序一樣)
為了友善說明,使用16進制表示這兩個數,即0x12345678和0x11223344。大端模式采用以下方式存儲這個兩個數字:
這兩種模式各有各的優點,用小端模式還是大端模式,取決于作業系統。