這次目標是使用程序注入,將一段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...