2

Pythonを使用して、バイナリのフローをリダイレクトするアセンブリコードを書き出そうとしています。これは学校用です。私はかなりうまくやっていますが、残念ながら行き詰まっています。実行する必要のあるアセンブリコード操作のリストを決定しましたが、問題はmovl呼び出しにあります。私はこれがのように見える必要がありますmovl $0x0, add(%ebp)。私はPythonを使用してこれらの16進値を環境変数に格納し、その環境変数の場所にジャンプすることを計画しています。だから、私は次のようなことをします

export CODE=`python -c 'print "somehex...\xc7\x45\xfc\x00\x00\x00\x00...morehex"'`

これにより、これがenvに正常に格納され、gdbでジャンプすると、アセンブリコードをx/iできます。このmovl呼び出しを除いて、すべてが良さそうです。\ x00を引数($ 0x0と想定)として読み取るのではなく、ソースの引数として次の4つの16進値を取ります。私が選択したPythonの方法でmovlのsrc引数に$0x0を書き込む他の方法を見つけることができません。

どんな助けでも大歓迎です。かなり長い間これに取り組んできました。

4

2 に答える 2

4

環境変数は C 文字列であり、\0バイトを保持できません。\0代わりに、バイトが含まれないようにシェルコードを記述する必要があります。subxor、または既存の 0 値を目的のレジスタ/メモリ位置に移動するなどの他の命令で 0 値を構築する必要があります。

ちなみに、Python の代わりに、短くて移植性の高い/bin/echo -e 'somehex\x00\x00more'.

于 2012-09-14T07:18:21.367 に答える
1

何かがヌルバイトを取り除いているようです。Python は正常に動作します。

$ python -c 'print "somehex...\xc7\x45\xfc\x00\x00\x00\x00...morehex"' | hexdump
0000000 73 6f 6d 65 68 65 78 2e 2e 2e c7 45 fc 00 00 00
0000010 00 2e 2e 2e 6d 6f 72 65 68 65 78 0a            
000001c

しかし、それを環境変数に書き込んで読み返すと、null が取り除かれます。

$ export CODE=`python -c 'print "somehex...\xc7\x45\xfc\x00\x00\x00\x00...morehex"'`
$ printenv CODE | hexdump
0000000 73 6f 6d 65 68 65 78 2e 2e 2e c7 45 fc 2e 2e 2e
0000010 6d 6f 72 65 68 65 78 0a                        
0000018
于 2012-09-14T07:27:18.553 に答える