主頁 > 企業開發 > 1.4 撰寫簡易ShellCode彈窗

1.4 撰寫簡易ShellCode彈窗

2023-07-03 07:43:04 企業開發

在前面的章節中相信讀者已經學會了使用Metasploit工具生成自己的ShellCode代碼片段了,本章將繼續深入探索關于ShellCode的相關知識體系,ShellCode 通常是指一個原始的可執行代碼的有效載荷,攻擊者通常會使用這段代碼來獲得被攻陷系統上的互動Shell的訪問權限,而現在用于描述一段自包含的獨立的可執行代碼片段,ShellCode代碼的撰寫有多種方式,通常會優先使用匯編語言實作,這得益于匯編語言的可控性,

ShellCode 通常會與漏洞利用并肩使用,或是被惡意代碼用于執行行程代碼的注入,通常情況下ShellCode代碼無法獨立運行,必須依賴于父行程或是Windows檔案加載器的加載才能夠被運行,本章將通過一個簡單的彈窗(MessageBox)來實作一個簡易版的彈窗功能,并以此來加深讀者對匯編語言的理解,

1.4.1 尋找DLL庫函式地址

在撰寫ShellCode之前,我們需要查找一個函式地址,由于我們需要呼叫MessageBoxA()這個函式,所以需要獲取該函式的記憶體動態地址,根據微軟的官方定義可知,該函式默認放在了User32.dll庫中,為了能夠了解壓堆疊時需要傳入引數的型別,我們還需要查詢一下函式的原型;

在微軟定義中MessageBoxA函式的原型如下:

int MessageBoxA(
  HWND hWnd,
  LPCSTR lpText,
  LPCSTR lpCaption,
  UINT uType
);

引數說明:

  • hWnd:訊息框的父視窗句柄,
  • lpText:訊息框中顯示的文本,
  • lpCaption:訊息框的標題欄文本,
  • uType:訊息框的型別,可以指定訊息框包含的按鈕以及圖示等,

需要注意的是,由于我們呼叫的是MessageBoxA,而此函式為ASCII模式,需要讀者自行修改解決方案,在配置屬性的常規選項卡,修改字符集(使用多位元組字符集)即可,如下圖所示;

讀者可以通過撰寫一段簡單的代碼來獲取所需資料,首先通過LoadLibrary函式加載名為user32.dll的元件,并將其基地址存盤在HINSTANCE型別的變數LibAddr中,然后,使用GetProcAddress函式獲取 MessageBoxA函式的地址,并將其存盤在MYPROC型別的變數ProcAddr中,最后輸出所需結果;

#include <windows.h>
#include <iostream>

typedef void(*MYPROC)(LPTSTR);

int main(int argc, char *argv[])
{
    HINSTANCE LibAddr,KernelAddr;
    MYPROC ProcAddr;

    // 獲取User32.dll基地址
    LibAddr = LoadLibrary("user32.dll");
    printf("user32.dll 動態庫基地址 = 0x%x \n", LibAddr);

    // 獲取kernel32.dll基地址
    KernelAddr = LoadLibrary("kernel32.dll");
    printf("kernel32.dll 動態庫基地址 = 0x%x \n", KernelAddr);

    // 獲取MessageBox基地址
    ProcAddr = (MYPROC)GetProcAddress(LibAddr, "MessageBoxA");
    printf("MessageBoxA 函式相對地址 = 0x%x \n", ProcAddr);

    // 獲取ExitProcess基地址
    ProcAddr = (MYPROC)GetProcAddress(KernelAddr, "ExitProcess");
    printf("ExitProcess 函式相對地址 = 0x%x \n", ProcAddr);

    system("pause");
    return 0;
}

上方的代碼經過編譯運行后會得到兩個回傳結果,如下圖所示,其中User32.dll的基地址是0x75a40000而該模塊內的MessageBoxA函式在當前系統中的地址為0x75ac0ba0,當然這兩個模塊地址在每次系統啟動時都會發生幻化,讀者電腦中的地址肯定與筆者不相同,這都是正常現象,之所以會出現這種情況是因為,系統中存在一種ASLR機制,

擴展知識:ASLR(Address Space Layout Randomization)機制的核心是用于隨機化系統中程式和資料的記憶體地址分布,從而增加攻擊者攻擊系統的難度,在啟用了ASLR機制的系統下,每次運行程式時,程式和系統組件(例如DLL、驅動程式等)都會被分配不同的記憶體地址,而不是固定的記憶體地址,這樣可以使得攻擊者難以利用已知的記憶體地址漏洞進行攻擊,因為攻擊者需要先找到正確的記憶體地址才能利用漏洞,ASLR的隨機化是根據作業系統的一些隨機因素進行計算的,例如啟動時間、行程 ID 等等,

由于如上機制的存在,導致user32.dll模塊地址不確定,也就會導致其地址內部的API函式地址也會發生一定的變化,下圖僅作為參考圖;

在獲取到MessageBoxA函式的記憶體地址以后,我們接著需要獲取一個ExitProecess函式的地址,這個API函式的作用是讓程式正常退出,這是因為我們注入代碼以后,原始的堆疊地址會被破壞,堆疊失衡后會導致程式崩潰,所以為了穩妥起見我們還是添加一行正常退出為好,函式ExitProcess的原型如下:

VOID WINAPI ExitProcess(
  UINT uExitCode
);

其中引數uExitCode指定了行程的退出代碼,表示行程成功退出或者發生了錯誤,如果uExitCode為0,表示行程成功退出,其他的非0值則表示行程發生了錯誤,不同的非0值可以用于表示不同的錯誤型別,

1.4.2 探討STDCALL呼叫約定

既然獲取到了相應的記憶體地址,那么接下來就需要通過匯編來撰寫可執行代碼片段了,在撰寫這段代碼之前,先來了解一下匯編語言的呼叫約定,在匯編語言中,要想呼叫某個函式,需要使用CALL陳述句,而在CALL陳述句的后面,要跟上該函式在系統中的地址,前面我們已經獲取到了相應的記憶體地址了,所以在這里就可以通過CALL相應的地址來呼叫相應的函式,

我們以32位應用程式為例,在32位應用程式內通常使用STDCALL呼叫約定,它定義了函式在被呼叫時,引數傳遞、回傳值傳遞以及堆疊的使用等方面的規則,該呼叫約定的規則如下所示:

  • 引數傳遞:引數從右向左依次壓入堆疊中,由被呼叫者在回傳前清理堆疊,
  • 回傳值傳遞:函式回傳時將回傳值存盤在EAX暫存器中,
  • 堆疊的使用:函式被呼叫前,呼叫者將引數壓入堆疊中;被呼叫者在回傳前清理堆疊,以確保堆疊的平衡,
  • 函式呼叫:在呼叫函式之前,呼叫者將回傳地址(Return Address)和EBP暫存器的值保存在堆疊中,并將ESP暫存器指向引數串列的最后一個元素;在函式回傳之后,呼叫者通過將之前保存的EBP和回傳地址彈出堆疊中,并將ESP暫存器恢復到最初的位置來恢復堆疊的狀態,

總之,stdcall呼叫約定將引數按照從右到左的順序壓入堆疊中,由被呼叫者清理堆疊,回傳值存盤在EAX暫存器中,函式呼叫者和被呼叫者都需要遵循一定的堆疊使用規則,這種約定的好處是引數傳遞簡單,可讀性高,并且在函式回傳時堆疊已經被清理,不需要額外的清理作業,

在實際的編程中,一般還是先將地址賦值給eax暫存器,然后再CALL呼叫相應的暫存器實作呼叫,比如現在筆者有一個lyshark(a,b,c,d)函式,如果我們想要呼叫它,那么它的匯編代碼就應該撰寫為:

push d
push c
push b
push a
mov eax,AddressOflyshark    // 獲取偏移地址
call eax                    // 間接呼叫

根據上方的呼叫方式,我們可以寫出ExitProcess()函式的匯編版呼叫結構,如下;

xor ebx, ebx
push ebx
mov eax, 0x76c84100
call eax

接著撰寫MessageBox()這個函式呼叫,與ExitProcess()函式不同的是,這個API函式包含有四個引數,當然第一和第四個引數,我們可以賦給0值,但是中間兩個引數都包含有較長的字串,這個該如何解決呢?我們不妨先把所需要用到的字串轉換為ASCII碼值,轉換的方式有許多,如下代碼則是通過Python實作的轉換模式;

import os,sys
from LyScript32 import MyDebug

# 字串轉ascii
def StringToAscii(string):
    ref = []
    for index in range(0,len(string)):
        hex_str = str(hex(ord(string[index])))
        ref.append(hex_str.replace("0x","\\x"))
    return ref

if __name__ == "__main__":

    # 輸出MsgBox標題
    title = StringToAscii("alert")
    for index in range(0,len(title)):
        print(title[index],end="")

    print()
    # 輸出MsgBox內容
    box = StringToAscii("hello lyshark")
    for index in range(0,len(box)):
        print(box[index],end="")

Python程式被運行,則用戶即可得到兩串通過編碼后的字串資料,

MsgBox標題:alert              \x61\x6c\x65\x72\x74\x21
MsgBox內容:hello lyshark      \x68\x65\x6c\x6c\x6f\x20\x6c\x79\x73\x68\x61\x72\x6b

由于我們使用的是32位匯編,所以上方的字串需要做一定的處理,我們分別將每四個字符為一組,進行分組,將不滿四個字符的,以空格0x20進行填充,這是因為我們采用的存盤字串模式為堆疊傳遞,而一個暫存器為32位,所以就需要填充滿4位元組才可以平衡;

-------------------------------------------------------------
填充 alert
-------------------------------------------------------------
\x61\x6c\x65\x72
\x74\x21\x20\x20

-------------------------------------------------------------
填充 hello lyshark
-------------------------------------------------------------
\x68\x65\x6c\x6c
\x6f\x20\x6c\x79
\x73\x68\x61\x72
\x6b\x20\x20\x20

上方的空位置之所以需要以0x20進行填充,而不是0x00進行填充,是因為strcpy這個字串拷貝函式,默認只要一遇到0x00就會認為我們的字串結束了,就不會再拷貝0x00后的內容了,所以這里就不能使用0x00進行填充了,這里要特別留意一下,

接著我們需要將這兩段字串分別壓入堆疊存盤,這里需要注意,由于我們的計算機是小端序排列的,因此字符的入堆疊順序是從后往前不斷進堆疊的,上面的字串壓堆疊引數應該寫為:

小提示:小端序(Little Endian)是一種資料存盤方式,在匯編語言中,小端序的表示方式與高位位元組優先(Big Endian)相反,例如,對于一個16位的整數0x1234,它在小端序的存盤方式下,將會被存盤為0x340x12(低位位元組先存盤);而在高位位元組優先的存盤方式下,將會被存盤為0x120x34(高位位元組先存盤),

-------------------------------------------------------------
壓入字串 alert
-------------------------------------------------------------
push 0x20202174
push 0x72656c61

-------------------------------------------------------------
壓入字串 hello lyshark
-------------------------------------------------------------
push 0x2020206b
push 0x72616873
push 0x796c206f
push 0x6c6c6568

既然字串壓入堆疊的功能有了,那么下面問題來了,我們如何獲取這兩個字串的地址,從而讓其成為MessageBox()的引數呢?

其實這個問題也不難,我們可以利用esp指標,因為它始終指向的是堆疊頂的位置,我們將字符壓入堆疊后,堆疊頂位置就是我們所壓入的字符的位置,于是在每次字符壓堆疊后,可以加入如下指令,依次將第一個字串基地址保存至eax暫存器中,將第二個基地址保存至ecx暫存器中,

xor ebx,ebx                 // 清空暫存器
push 0x20202174             // 字串 alert 
push 0x72656c61
mov eax,esp                 // 獲取第一個字串的地址

push ebx                    // 壓入00為了將兩個字串分開

push 0x2020206b             // 字串 hello lyshark
push 0x72616873
push 0x796c206f
push 0x6c6c6568
mov ecx,esp                 // 獲取第二個字串的地址

上方匯編指令完成壓堆疊以后,接下來我們就可以呼叫MessageBoxA函式了,其呼叫代碼如下,

push ebx                             // push 0
push eax                             // push "alert"
push ecx                             // push "hello lyshark !"
push ebx                             // push 0
mov eax,0x75ac0ba0                   // 將MessageBox地址賦值給EAX
call eax                             // 呼叫 MessageBox

1.4.3 ShellCode提取與應用

通過上方的實作流程,我們的ShellCode就算開發完成了,接下來讀者只需要將上方ShellCode整理成一個可執行檔案并編譯即可,

#include <iostream>

int main(int argc, char *argv[])
{
    _asm
    {
        sub esp, 0x50          // 抬高堆疊頂,防止沖突
        xor ebx, ebx           // 清空ebx
        push ebx
        push 0x20202174
        push 0x72656c61        // 字串 "alert"
        mov eax, esp           // 獲取堆疊頂
        push ebx               // 填充00 截斷字串

        push 0x2020206b
        push 0x72616873
        push 0x796c206f
        push 0x6c6c6568         // 字串 hello lyshark
        mov ecx, esp            // 獲取第二個字串的地址

        push ebx
        push eax
        push ecx
        push ebx
        mov eax, 0x75ac0ba0    // 獲取MessageBox地址
        call eax               // call MessageBox

        push ebx
        mov eax, 0x76c84100   // 獲取ExitProcess地址
        call eax              // call ExitProcess
    }
    return 0;
}

接下來就是需要手動提取此處匯編指令的特征碼,本案例中我們可以通過x64dbg中的LyScript插件實作提取,首先載入被除錯行程,然后尋找到如下所示的特征位置,當遇到Call時,則通過F7進入到內部,如下圖所示;

如下圖中所示,就是我們所需要的匯編指令集,也就是我們自己的ShellCode代碼片段,記憶體地址為0x002D12A0轉換為十進制為2953888

通過LyScript插件并撰寫如下腳本,并將EIP位置設定為eip = 2953888運行這段代碼;

from LyScript32 import MyDebug

if __name__ == "__main__":
    dbg = MyDebug()
    dbg.connect()
    ShellCode = []
    eip = 2953888

    for index in range(0, 100 - 1):
        read_code = dbg.read_memory_byte(eip + index)
        ShellCode.append(str(hex(read_code)))

    for index in ShellCode:
        print(index.replace("0x","\\x"),end="")
    dbg.close()

則可輸出如下圖所示的完整特征碼,讀者可自行將此處特征碼格式化;

當然讀者通過在_asm指令位置設定F9斷點,并通過F5啟動除錯,如下圖所示;

當除錯器被斷下時,通過按下Ctrl+Alt+D跳轉至反匯編代碼位置,并點擊顯示代碼位元組,同樣可以實作提取,如下圖所示;

我們直接將上方的這些機器碼提取出來,從而撰寫出完整的ShellCode,最終測驗代碼如下,

#include <windows.h>
#include <stdio.h>
#include <string.h>

#pragma comment(linker,"/section:.data,RWE")

unsigned char shellcode[] = "\x83\xec\x50"
"\x33\xdb"
"\x53"
"\x68\x74\x21\x20\x20"
"\x68\x61\x6c\x65\x72"
"\x8b\xc4"
"\x53"
"\x68\x6b\x20\x20\x20"
"\x68\x73\x68\x61\x72"
"\x68\x6f\x20\x6c\x79"
"\x68\x68\x65\x6c\x6c"
"\x8b\xcc"
"\x53"
"\x50"
"\x51"
"\x53"
"\xb8\xa0\x0b\xac\x75"
"\xff\xd0"
"\x53"
"\xb8\x00\x41\xc8\x76"
"\xff\xd0";

int main(int argc, char **argv)
{
    LoadLibrary("user32.dll");
    __asm
    {
        lea eax, shellcode
        call eax
    }
    return 0;
}

上方代碼經過編譯以后,運行會彈出一個我們自己DIYMessageBox提示框,輸出效果圖如下所示;

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

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

標籤:訊息安全

上一篇:css學習(一)

下一篇:返回列表

標籤雲
其他(162003) Python(38266) JavaScript(25520) Java(18286) C(15238) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7281) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4609) 数据框(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) .NET技术(1985) HtmlCss(1983) 功能(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.4 撰寫簡易ShellCode彈窗

    在前面的章節中相信讀者已經學會了使用Metasploit工具生成自己的ShellCode代碼片段了,本章將繼續深入探索關于ShellCode的相關知識體系,ShellCode 通常是指一個原始的可執行代碼的有效載荷,攻擊者通常會使用這段代碼來獲得被攻陷系統上的互動Shell的訪問權限,而現在用于描述... ......

    uj5u.com 2023-07-03 07:43:04 more
  • css學習(一)

    ### css引入 1. 行內樣式 ```css 我是div元素 ``` 2.內部樣式 ```css ``` 3. 外部樣式 ```css /* 可以通過@import引入其他的css資源 */ @import url(./style.css); @import url(./test.css); . ......

    uj5u.com 2023-07-02 08:01:55 more
  • 什么是 CSR、SSR、SSG、ISR - 渲染模式詳解

    本文以 `React`、`Vue` 為例,介紹下主流的渲染模式以及在主流框架中如何實作上述的渲染模式。 ## 前置知識介紹 看渲染模式之前我們先看下幾個主流框架所提供的相關能力,了解的可跳到下個章節。 ### 掛載組件到 DOM 節點 這是主流框架最基本的能力,就是將組件渲染到指定的 `DOM` 節 ......

    uj5u.com 2023-07-02 07:56:36 more
  • vue中封裝服務器地址/介面與設定請求頭

    1. 設定請求頭 首先創建一個放置服務器地址的js,如http.js,然后在http.js中引入axios `import axios from "axios";` 如果沒有axios,需要先安裝,npm i axios或者yarn add axois,然后重啟服務器 ...直接上代碼 點擊查看代碼 ......

    uj5u.com 2023-07-02 07:56:27 more
  • vue中封裝服務器地址/介面與設定請求頭

    1. 設定請求頭 首先創建一個放置服務器地址的js,如http.js,然后在http.js中引入axios `import axios from "axios";` 如果沒有axios,需要先安裝,npm i axios或者yarn add axois,然后重啟服務器 ...直接上代碼 點擊查看代碼 ......

    uj5u.com 2023-07-02 07:56:12 more
  • css學習(一)

    ### css引入 1. 行內樣式 ```css 我是div元素 ``` 2.內部樣式 ```css ``` 3. 外部樣式 ```css /* 可以通過@import引入其他的css資源 */ @import url(./style.css); @import url(./test.css); . ......

    uj5u.com 2023-07-02 07:55:38 more
  • 1.3 Metasploit 生成SSL加密載荷

    在本節中,我們將介紹如何通過使用`Metasploit`生成加密載荷,以隱藏網路特征。前一章節我們已經通過`Metasploit`生成了一段明文的ShellCode,但明文的網路傳輸存在安全隱患,因此本節將介紹如何通過生成SSL證書來加密ShellCode,使得網路特征得到隱藏,從而提高后門的生存能... ......

    uj5u.com 2023-07-02 07:55:08 more
  • 1.3 Metasploit 生成SSL加密載荷

    在本節中,我們將介紹如何通過使用`Metasploit`生成加密載荷,以隱藏網路特征。前一章節我們已經通過`Metasploit`生成了一段明文的ShellCode,但明文的網路傳輸存在安全隱患,因此本節將介紹如何通過生成SSL證書來加密ShellCode,使得網路特征得到隱藏,從而提高后門的生存能... ......

    uj5u.com 2023-07-02 07:54:11 more
  • 記錄--讓整個網站界面無滾動條

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 界面無滾動條 滾動條的優化也有很多種,比如隨便再網上搜索美化瀏覽器滾動條樣式,就會出現些用css去美化滾動條的方案。 那種更好呢? 沒有更好只有更合適 像默認的滾動條的話,他能讓你方便摁著往下滑動(他比較寬)特別省勁,不用擔心美化過后變細 ......

    uj5u.com 2023-07-01 08:44:29 more
  • vane 一個適用于前端打工人的全堆疊框架,nodejs+vue3+typescript

    # vane 寫這個的初衷是因為每次用node寫介面的時候總是需要一些寫大一堆的東西, 也有些人把很多介面都放在一個js檔案內, 看起來很是雜亂, 后來用到nuxt寫的時候, 感覺用檔案名來命名介面路徑很是方便, 無論是query引數還是params引數,都可以通過檔案名來命名, 也可以通過檔案夾層 ......

    uj5u.com 2023-07-01 08:44:23 more