2017-07-22 76 views
0

一個字節的字符串我發現在python下面的代碼:扭轉在Python

def ExtractShellcodeArm(_arg_name): 
    ObjDumpOutput(_arg_name) 
    print("\033[101m\033[1mExtracted Shellcode:\033[0m\n") 

    proc = subprocess.Popen(['objdump','-d',_arg_name], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

    while True: 
     line = proc.stdout.readline() 
     if line != b'': 
      array = line.decode().rstrip().split(':') 
      if len(array) > 1: 
       if array[1]: 
        array2 = array[1].split(' ') 
        array2 = array2[0].lstrip().rstrip() 
        if array2: 
         sc_part = '\t"' 
         sc_part += '\\x' 
         sc_part += '\\x'.join(a+b for a,b in zip(array2[::2], array2[1::2])) 
         sc_part += '"+' 
         print(sc_part) 
     else: 
      break 

後,我在python3運行此代碼它給我的objdump的工具,如下面的結果:

"\xe2\x8f\x60\x01"+ 
"\xe1\x2f\xff\x16"+ 
"\x22\x0c"+ 
"\x46\x79"+ 
"\x31\x0e"+ 
"\x20\x01"+ 
"\x27\x04"+ 
"\xdf\x01"+ 
"\x1b\x24"+ 
"\x1c\x20"+ 
"\x27\x01"+ 
"\xdf\x01"+ 
"\x6c\x6c\x65\x48"+ 
"\x6f\x57\x20\x6f"+ 
"\x0a\x64\x6c\x72"+ 

但我想它顯示的結果在大端格式。我如何在python函數中更改此represantion。比如我想這個代碼顯示了類似下面的結果:

"\x01\x60\x8f\xe2"+ 
"\x16\xff\x2f\xe1"+ 
"\x0c\x22"+ 
"\x79\x46"+ 
... 
+0

Try:'print(sc_part [:: - 1])' –

+0

該命令顛倒了整個字符串。但我想要字符串重新渲染2字節2字節。 –

+0

我想要字符串「\ xe2 \ x8f \ x60 \ x01」變成「\ x01 \ x60 \ x8f \ xe2」。 –

回答

0

這不是最漂亮的代碼,但是這個工程:

''.join(a+b for a, b in zip(s[::-2], s[-2::-2])) 
0

,可以儲存每個完整的操作碼(字節集)作爲元素放入列表中,然後遍歷列表,逐個翻轉操作碼中的字節。例如,而不是opcodes "\xcd\x80" + "\xeb\xfe"使用opcodes = ["\xcd\x80", "\xeb\xfe"。迭代列表並反轉每個操作碼應該沒有問題。

另一個選擇是使用shell實用程序在Python收到它們之前將字節反轉,方法是將objdump命令通過管道連接到像sed和awk這樣的工具來完成此操作,將每行上的字節拆分成列,然後向後打印列。