python pyc文件解析_pyc文件(Python.org)
code object?
在我們導入 python 腳本時在目錄下會生成個一個相應的 pyc 文件,是pythoncodeobj的持久化儲存形式,加速下一次的裝載。
文件結構?
pyc文件由三大部分組成
最開始4個字節(jié)是一個Maigc int, 標識此pyc的版本信息
接下來四個字節(jié)還是個int,是pyc產(chǎn)生的時間
序列化的 PyCodeObject,結構參照include/code.h,序列化方法python/marshal
pyc完整的文件解析可以參照
關于co_code
由
python3.6 以上參數(shù)永遠占1字節(jié),如果指令不帶參數(shù)的話則以0x00代替,在運行過程中被解釋器忽略,也是Stegosaurus技術原理;而低于python3.5的版本中指令不帶參數(shù)的話卻沒有0x00填充
例題?
首先嘗試pycdc反編譯失敗
# Source Generated with Decompyle++
# File: imgenc.pyc (Python 2.7)
import sys
import numpy as np
from scipy.misc import imread, imsave
def doit(input_file, output_file, f):
Unsupported opcode: STOP_CODE
img = imread(input_file, flatten = True)
img /= 255
size = img.shape[0]
# WARNING: Decompyle incomplete
注意到是python2.7,也就是說指令序列共占1字節(jié)或3字節(jié)(有參數(shù)無參數(shù))
使用pcads得到
imgenc.pyc (Python 2.7)
…
67 STOP_CODE
68 STOP_CODE
69 BINARY_DIVIDE
70 JUMP_IF_TRUE_OR_POP 5
73 LOAD_CONST 3: 0
76 LOAD_CONST 3: 0
79 BINARY_DIVIDE
定位到出錯的地方,觀察發(fā)現(xiàn) LOAD_CONST LOAD_CONST BINARY_DIVIDE STORE_FAST opcodes (64 03 00 64 03 00 15 7d 05 00)被破壞了,根據(jù)上下文線索修復后
00000120 64 04 00 6b 00 00 72 ce 00 64 03 00 64 03 00 15 |d..k..r..d..d…|
00000130 7d 05 00 64 03 00 64 03 00 15 7d 05 00 64 03 00 |}..d..d…}..d..|
00000140 64 03 00 15 7d 05 00 64 03 00 64 03 00 15 7d 05 |d…}..d..d…}.|
00000150 00 64 03 00 64 03 00 15 7d 05 00 64 03 00 64 03 |.d..d…}..d..d.|
00000160 00 15 7d 05 00 64 03 00 64 03 00 15 7d 05 00 64 |..}..d..d…}..d|
00000170 03 00 64 03 00 15 7d 05 00 64 03 00 64 03 00 15 |..d…}..d..d…|
00000180 7d 05 00 64 03 00 64 03 00 15 7d 05 00 64 03 00 |}..d..d…}..d..|
00000190 64 03 00 15 7d 05 00 64 03 00 64 03 00 15 7d 05 |d…}..d..d…}.|
000001a0 00 64 03 00 64 03 00 15 7d 05 00 64 03 00 64 03 |.d..d…}..d..d.|
000001b0 00 15 7d 05 00 64 03 00 64 03 00 15 7d 05 00 6e |..}..d..d…}..n|
接下來根據(jù)修復好的python源代碼得到flag即可
延伸:
Tools?
將python字節(jié)碼轉換為可讀的python 源代碼,包含了反匯編(pycads)和反編譯(pycdc)兩種工具
允許我們在Python字節(jié)碼文件(pyc或pyo)中嵌入任意Payload。由于編碼密度較低,因此我們嵌入Payload的過程既不會改變源代碼的運行行為,也不會改變源文件的文件大小
原理是在python的字節(jié)碼文件中,利用冗余空間,將完整的payload代碼分散隱藏到這些零零碎碎的空間中.
評論
總結
以上是生活随笔為你收集整理的python pyc文件解析_pyc文件(Python.org)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 未来之战活动商店在哪(未来可期名人名言)
- 下一篇: 苹果怎么拒接电话