2015-10-10 155 views
-2

我在互聯網安全類中有項目。我的合作伙伴開始了這個項目並編寫了一些python代碼,我必須從他停下的地方繼續。但是我不知道python,我打算通過運行他的代碼並檢查它的工作方式來學習。但是當我執行他的代碼時,我得到一個錯誤,即「IndexError:列表索引超出範圍」。索引錯誤:python中的列表索引超出範圍

import os 
# Deauthenticate devices 
os.system("python2 ~/Downloads/de_auth.py -s 00:22:b0:07:58:d4 -d & sleep 30; kill $!") 
# renew DHCP on linux "sudo dhclient -v -r & sudo dhclient -v" 


# Capture DHCP Packet 
os.system("tcpdump -lenx -s 1500 port bootps or port bootpc -v > dhcp.txt & sleep 20; kill $!") 

# read packet txt file 
DHCP_Packet = open("dhcp.txt", "r") 

# Get info from txt file of saved packet 
line1 = DHCP_Packet.readline() 
line1 = line1.split() 
sourceMAC = line1[1] 
destMAC = line1[3] 
TTL = line1[12] 
length = line1[8] 

#Parse packet 
line = DHCP_Packet.readline() 
while "0x0100" not in line: 
    line = DHCP_Packet.readline() 

packet = line + DHCP_Packet.read() 

packet = packet.replace("0x0100:", "") 
packet = packet.replace("0x0110:", "") 
packet = packet.replace("0x0120:", "") 
packet = packet.replace("0x0130:", "") 
packet = packet.replace("0x0140:", "") 
packet = packet.replace("0x0150:", "") 
packet = packet.replace("\n", "") 
packet = packet.replace(" ", "") 
packet = packet.replace(" ", "") 
packet = packet.replace("000000000000000063825363", "") 

# Locate option (55) = 0x0037 
option = "0" 
i=0 
length = 0 
while option != "37": 
    option = packet[i:i+2] 
    hex_length = packet[i+2:i+4] 
    length = int(packet[i+2:i+4], 16) 
    i = i+ length*2 + 4 

i = i - int(hex_length, 16)*2 
print "Option (55): " + packet[i:i+length*2 ] + "\nLength: " + str(length) + " Bytes" 
print "Source MAC: " + sourceMAC 

謝謝很多

+0

你認爲什麼是錯的?請包括堆棧跟蹤。如果它「緊急」,那麼你的預算是什麼? –

+0

(對於它的價值,看起來你的合作伙伴不太瞭解Python) –

+0

事實證明,我不得不指定我在linux命令中使用的接口。 Python代碼工作得很好。無論如何感謝 – smn14

回答

1

指數誤差可能意味着你在你的列表空或未定義的部分(指數)。這是最有可能在底部循環條件:

while option != "37": 
    option = packet[i:i+2] 
    hex_length = packet[i+2:i+4] 
    length = int(packet[i+2:i+4], 16) 
    i = i+ length*2 + 4 

或者,也可以在閱讀文本文件更早:

# Get info from txt file of saved packet 
line1 = DHCP_Packet.readline() 
line1 = line1.split() 
sourceMAC = line1[1] 
destMAC = line1[3] 
TTL = line1[12] 
length = line1[8] 

嘗試實際打開文本文件,並確保所有的線正確提及。

如果您不熟悉編碼,但不習慣理解錯誤消息或使用調試器,找到問題區域的一種方法是在代碼中的行之間包括print ('okay'),逐步將其向下移動,直到行不再打印。我發現通過編寫自己的代碼並使用Google搜索想要實現的內容(特別是當合作夥伴離開你的代碼時,它更容易學習)。該網站提供的文檔上內置的命令(選擇您的版本在頂部):https://docs.python.org/3.4/contents.html, 這個網站包含更深入的教程常用功能:http://www.tutorialspoint.com/python/index.htm

0

我覺得變量line1是被分裂沒有多達13個數字,因此執行語句TTL = line1[12]時會出錯。

也許你沒有和你的合作伙伴一樣的環境,所以通過執行os.system(「」)得到的結果(文件dhcp.txt)可能爲空(或者格式不正確)。 您應該檢查文件dhcp.txt的內容或在line1 = DHCP_Packet.readline()之後添加語句print line1以檢查它是否具有正確的格式。

+0

顯然tcpdump正在接口eth0上監聽,而不是在wlan1上。我改變了mac地址和使用的接口,它工作。所以基本上它沒有捕獲任何數據包,而dhcp.txt是空的。謝謝你:) – smn14