天天看點

CS shellcode提取IP&port:

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

CS shellcode提取IP&port:

起初做的平台是用CS生成的shellcode去生成免殺馬,後來感覺太過于麻煩,每次生成免殺木馬前都要先去生成shellcode,遂改良了一下,下面講一下我從CS shellcode提取IP&port的思路:

1.首先Cobalt Strike生成C(java、python、perl、C#、ruby都行)的payload:

CS shellcode提取IP&port:

如上圖所示:生成木馬的IP為172.18.42.63,端口為5555:

修改木馬格式,将木馬修改為16進制格式,形如:<code>0xfc,0x48,0x83,0xe4...</code>:

現在開始正式分析這個payload,将16進制的payload轉換為string類型:

編譯執行可直接找到IP:172.18.42.63,由此可見IP是直接string -&gt; byte放到shellcode裡的,

将IP(string類型):<code>172.18.42.63</code>轉換為byte類型,去鎖定其在shellcode中的位置:

CS shellcode提取IP&amp;port:
CS shellcode提取IP&amp;port:

至此,我們就找到了IP,但是端口并沒有找到,翻閱百度、問群友無果後決定換個思路找找看:

5555(端口号)的16進制為15b3:

CS shellcode提取IP&amp;port:

起初并沒有搜到,以為思路不對,但是在搜0x15的時候發現0xb3在0x15的前面:

CS shellcode提取IP&amp;port:
CS shellcode提取IP&amp;port:

會不會是<code>小端模式</code>的原因,端口轉16進制,在shellcode裡的表示正好是反着的?抱着這樣的了解,準備再生成一個6666端口的shellcode驗證一下:

6666的16進制為:1a0a,在shellcode中的表示為0x0a, 0x1a,正好是反着的,驗證了我們的想法,至此IP和端口就都找到了。

CS shellcode提取IP&amp;port:

這裡普及一下小端模式和大端模式:

小端模式:是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中。

簡單的說就是低位址存低位,高位址存高位:

為了友善說明,使用16進制表示這兩個數,即0x12345678和0x11223344。小端模式采用以下方式存儲這個兩個數字:

CS shellcode提取IP&amp;port:

大端模式:是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中。

簡單的上,就是低位址存高位,高位址存低位(跟人讀寫數值的順序一樣)

為了友善說明,使用16進制表示這兩個數,即0x12345678和0x11223344。大端模式采用以下方式存儲這個兩個數字:

CS shellcode提取IP&amp;port:

這兩種模式各有各的優點,用小端模式還是大端模式,取決于作業系統。