程序注入學習

2021-06-27 17:33:45 字數 2951 閱讀 7564

這次目標是使用程序注入,將一段shellcode注入到乙個程序,然後執行。

主要的思路是1.編寫shellcode,目的是彈出乙個對話方塊 2.在目標進行分配一段空間,並且寫入shellcode,然後使用createremotethread() api建立乙個遠端執行緒並且執行。

1.shellcode的編寫

shellcode的作用是彈出乙個messagebox,需要的步驟有1.使用loadlibrarya載入user32.dll 2.使用getprocaddress獲取messageboxa的入口位址。並且呼叫messageboxa。

然而不同系統的loadlibrarya的位址和getprocaddress的位址都不同,為此需要先獲得kernel32.dll的基址,然後減去乙個偏移量得到getprocaddress和loadlibrarya的位址。

要獲得二進位制的shellcode,我先用彙編寫出了**,然後通過ollydbg反彙編將二進位制**獲得,然後寫入shellcode。

其中彙編**如下

assume fs:nothing

mov eax,fs:[30h]

test eax,eax

js os_9x

os_nt:

mov eax,[eax+0ch]

mov esi,[eax+1ch]

lodsd

mov eax,[eax+8]

jmp k_finished

os_9x:

mov eax,[eax+34h]

mov eax,[eax+7ch]

mov eax,[eax+3ch]

k_finished:nothing

最終的kernel32.dll的基址存在了eax暫存器。

通過eax減去偏移量就獲得了  loadlibrarya和getprocaddress的位址, 偏移量的獲得方式可以在k_finished後面加上mov dword ptr[addr], eax

假設eax是提前定義的乙個unsigned int變數, 然後用addr - (unsigned int)loadlibrarya獲取出偏移量,同樣的方式可以得到getprocaddress的偏移量。

loadlibrarya的引數字串user32.dll 以及messageboxa字串和彈出對話方塊的標題和內容的字串,我們在棧上分配乙個臨時的空間,然後將內容存到棧上面。

部分彙編**如下,先分配40個空間,然後將user32.dll的每個字元都mov到這個空間裡面,最後加上/0

sub esp, 40

mov [ebp - 2b], 'u'

mov [ebp - 2a], 's'

mov [ebp - 29], 'e'

mov [ebp - 28], 'r'

mov [ebp - 27], '3'

mov [ebp - 26], '2'

mov [ebp - 25], '.'

mov [ebp - 24], 'd'

mov [ebp - 23], 'l'

mov [ebp - 22], 'l'

mov [ebp - 21], 0x0

使用的時候可以獲取字串的位址lea eax, [ebp - 2b].

完成了這些準備工作,就可以比較容易的寫出彙編**了,下面將完成shellcode和注釋的彙編**貼出來。

char code = ;

2.注入程式的編寫

注入的步驟分為

獲取程序的pid,然後通過openprocess建立程序的控制代碼。在程序中分配空間使用virtualallocex,然後返回值是分配記憶體的位址,通過這個位址使用writeprocessmemory將shellcode寫入到記憶體中。然後通過createremotethread建立乙個遠端執行緒,然後使用waitforsingleobject等待遠端執行緒結束。

最後使用virtualfreeex,closehandle進行清理。

最終**為:

/*

*使用vc2012 express編譯

*/#include char code = ;

int main(int argc, char *argv)

pid = atoi(argv[1]);

if (pid <= 0)

hproc = openprocess(process_create_thread

| process_query_information

| process_vm_operation

| process_vm_write

| process_vm_read,

false, pid);

addr = (pbyte)virtualallocex(hproc, 0, sizeof(code), mem_commit, page_execute_readwrite);//分配記憶體,然後起始位址儲存在addr

ret = writeprocessmemory(hproc, addr, code, sizeof(code), null); //將**寫入到分配好的記憶體中。

if (ret)

else

}else

if(!virtualfreeex(hproc, addr,0 , mem_release))

else

if (!closehandle(hproc))

printf("[i]: process (%d) is closed. \n", pid);

return 0;

}

通過任務管理器檢視到目標程序的pid之後,然後在命令列使用命令列引數inj.exe 8888進行注入(這裡假設次程式的名字為inj.exe 程序的pid為8888)。

如果目標程序沒有防禦措施的話,就會建立乙個執行緒然後彈出乙個對話方塊。

SQL注入學習

通常情況下,可能存在 sql 注入漏洞的 url 是類似這種形式 對 sql 注入的判斷,主要有兩個方面 可能存在 sql 注入攻擊的 asp php jsp 動態網頁中,乙個動態網頁中可能只有乙個引數,有時可能有多個引數。有時是整型引數,有時是字串型引數,不能一概而論。總之只要是帶有引數的 動態網...

SQL注入學習

2018 02 03 grant 授權語句 revoke 取消許可權 get 方式url的後面可以跟上?query語句 post方式可以上傳檔案或表單 cookie 需要關注的注入點 構造語句 admin or 1 1 回顯 使用union聯合語句 正常可執行 不正常會報錯 不回顯的叫盲注 whal...

關於SQL注入學習

知道sql injection 但是平時懶的去做這方面的東西,以後一定還得注意 net的專案看來要用儲存過程和分層方式來寫了 sql injection 講解 方法 網上蒐集 1.帶引數的的儲存過程來完成使用者驗證的過程 2.使用者通過 提交過來的變數引數進行檢查的 發現客戶端提交的引數中有 exe...