在github有乙個ssi的專案,專案位址如下: 他可以實現shellcode的遠端載入(十六進製制),當然ldrakura也曾經搞過類似的專案(我偷電瓶車養你啊),當時還是一次專案時繞卡巴斯基的時候他丟我的。本文將簡單介紹該項目的原理,並給出其他實現方法。
shellcode處理
首先需要處理shellcode,這裡推薦使用kali直接處理,推薦下面的兩種方法。
cat 1.txt | grep -v unsigned|sed "s/\"\\\x//g"|sed "s/\\\x//g"|sed "s/\"//g"|sed ':a;n;$!ba;s/\n//g'|sed "s/;//g"
或者
載入原理
載入器通過引數的方式傳遞hex的shellcode到載入器內,然後使用一些操作還原shellcode,這裡有一些需要注意的點,比如陣列的長度為1066,那麼他就是由shellcode[0]=f到shellcode[1665]=7構成後面加上乙個終止符,此時strlen(shellcode)=1666,sizeof(shellcode)=1667,所以在計算長度時便需要這樣 x=(sizeof(shellcode) - 1) . or x= strlen(shellcode),因為每兩個位元組為一組,所以我們在分配記憶體時,需要進行除二操作,比如bytes = (sizeof(shellcode) - 1)/2 或者 bytes = strlen(shellcode)/2。
接下來便是還原shellcode的操作了
for(unsigned int i = 0; i< iterations-1; i++)
或者使用下面這樣的方法:
void asciitohex(char * pascii, unsigned char * phex, int nlen) // for (int j = ...) phex[i] = nibble[0] << 4; // set the high nibble phex[i] |= nibble[1]; //set the low nibble } // for (int i = ...) }
然後剩下的便是分配記憶體、裝入shellcode,作者使用的是
(*(void (*)()) exec)();
來進行最後的載入。
測試明白原理之後,重新編譯(原檔案md5可能已被標記),使用360全家桶進行掃瞄:
聯網情況下是沒有任何問題的,然後上線我們的cs試試:
可直接上線,注:x64的shellcode上線有問題,程式會崩潰。
修改更改shellcode前幾個位元組,然後載入到記憶體更改回來,然後解密hex載入,並更改shellcode載入方式。
更改載入的方法之前也是發過的。
反轉方式如下:
char first = "\xfc";memcpy(shellcode,fisrt,1);
載入方式如下:
typedef void (*some_func)(); some_func func = (some_func)exec; func();
ps:只是更改了乙個寫法。
測試彈出計算器:
windows defender上線測試:
總結:歡迎star
字串反轉,單詞反轉
一 字串反轉,共蒐集了 7 種方法 public class stringreversed public static void reverse1 string s char c s.tochararray 方法二 for int i 0 i s.length 2 i for char l c sy...
字串反轉
據說一道微軟的面試題,要求考慮時間和空間的優化,下面給出幾種通常字串反轉的方法 1 直接陣列操作 char strreverse char str return str 這種做法原來的str沒有儲存,原來的str也改變了 2 指標操作 char strreverse char str return ...
字串反轉
include include include 方法一 將第乙個字元和最後乙個互換,第二個和倒數第二個互換,如此依次迴圈下去 char strrev1 const char str return tmp free tmp 方法二 不額外申請一片儲存字串的記憶體空間,通過中間變數來改變傳遞進來的字串裡...