4

私はPythonを初めて使用し、スタックオーバーフロー用に作成した単純なエクスプロイト(nopスレッド、シェルコード、およびリターンアドレスのみ)を移植しようとしています。これは悪意のある目的ではなく、大学でのセキュリティ講義用です。

16 進文字列 (デッドビーフ) が与えられた場合、次の最善の方法は何ですか?

  • 一連のバイトとして表現する
  • 値を加算または減算する
  • 順序を逆にする (x86 メモリ レイアウト、つまり efbeadde の場合)

Python でのエクスプロイト作成における一般的なタスクに関するヒントやコツも大歓迎です。

4

3 に答える 3

4

Python 2.6 以降では、組み込みクラスを使用できますbytearray

bytearrayオブジェクトを作成するには:

b = bytearray.fromhex('deadbeef')

バイトを変更するには、配列表記を使用して参照できます。

b[2] += 7

bytearrayインプレースを逆にするには、 を使用しますb.reverse()。逆の順序で反復する反復子を作成するには、次のreversed関数を使用できますreversed(b)

bytesPython 3 の新しいクラスにも興味があるかもしれませんが、これは似bytearrayていますが不変です。

于 2011-05-07T00:52:00.573 に答える
0

これが最善の方法かどうかはわかりません...

hex_str = "deadbeef"
bytes = "".join(chr(int(hex_str[i:i+2],16)) for i in xrange(0,len(hex_str),2))
rev_bytes = bytes[::-1]

またはもっと簡単かもしれません:

bytes = "\xde\xad\xbe\xef"
rev_bytes = bytes[::-1]
于 2011-05-07T00:39:23.300 に答える
0

Python 2.x では、通常strの値はバイナリ セーフです。binasciiモジュールのb2a_hexおよびa2b_hex関数を使用して、16 進数との間の変換を行うことができます。

通常の文字列メソッドを使用して、バイトを反転または再配置できます。ただし、あらゆる種類の算術演算を行うには、ord関数を使用して個々のバイトの数値を取得chrし、結果を逆変換してから、連結して変更された文字列を再構築する必要があります。

算術演算が簡単なミュータブル シーケンスの場合は、型 code でarrayモジュールを使用します'B'。これらはa2b_hex、16 進数から開始する場合の結果から初期化できます。

于 2011-05-07T01:09:17.260 に答える