3

私はこの記事からバッファオーバーフローexample3を複製しようとしていますalephone

私はこれを、私が受講しているコンピュータセキュリティコースのプロジェクトの練習として行っています。どうぞよろしくお願いします。あなたの助けが必要です。私は次の例を実行し、作業を進めながらタスクを実行してきました。私の問題は、私のコンピューターにダンプされたアセンブリコードgdb(VMWareで実行されているDebianLinuxイメージでこれを行っている)が記事の例とは異なることです。私が混乱していると思ういくつかの構成があります。

これが私のコンピューターからのものです: 代替テキスト

これが記事からのものです...

Dump of assembler code for function main:
0x8000490 <main>:       pushl  %ebp
0x8000491 <main+1>:     movl   %esp,%ebp
0x8000493 <main+3>:     subl   $0x4,%esp
0x8000496 <main+6>:     movl   $0x0,0xfffffffc(%ebp)
0x800049d <main+13>:    pushl  $0x3
0x800049f <main+15>:    pushl  $0x2
0x80004a1 <main+17>:    pushl  $0x1
0x80004a3 <main+19>:    call   0x8000470 <function>
0x80004a8 <main+24>:    addl   $0xc,%esp
0x80004ab <main+27>:    movl   $0x1,0xfffffffc(%ebp)
0x80004b2 <main+34>:    movl   0xfffffffc(%ebp),%eax
0x80004b5 <main+37>:    pushl  %eax
0x80004b6 <main+38>:    pushl  $0x80004f8
0x80004bb <main+43>:    call   0x8000378 <printf>
0x80004c0 <main+48>:    addl   $0x8,%esp
0x80004c3 <main+51>:    movl   %ebp,%esp
0x80004c5 <main+53>:    popl   %ebp
0x80004c6 <main+54>:    ret
0x80004c7 <main+55>:    nop

ご覧のとおり、この2つには違いがあります。混乱していて、コンピューターからアセンブリコードを完全に理解することはできません。両者の違いを知りたいのですが。

、、などとどうpushl違うのpushmov vs movl...

その表現はどういう0xhexavalue(%register)意味ですか?

たくさん質問してすみませんが、どうしてもあなたの助けが必要です。

アップデート:

関数'function'のパラメータが別のアセンブリコードに変換されたのはなぜですか。

記事から、関数のパラメーター1、2、3がスタックにプッシュされたと思います。

私のコンピューターからのものでは、パラメーターはいくつかのオフセットでレジスター'esp'に移動されました。

彼らは違いますか?ありがとう

本当に助けてくれてありがとう...

4

3 に答える 3

4

本当の違いはありません。「movl」は「長く移動する」、つまり32ビット値を移動することを意味します。この記事のコードでは、毎回この明示的な形式を使用しています。逆アセンブルしたコードは、オペランドから推測できる場合は「l」を省略します(たとえば、値をEAXに移動する場合、EAXは32ビットレジスタであるため、32ビット値である必要があります。 ECXは32ビットレジスタでもあるため、ECXをプッシュするには32ビット値をプッシュする必要があります)。

もちろん、コード間には実際の違いがありますが、それは純粋にそれぞれが使用している表記法です。

于 2010-06-16T17:08:36.193 に答える
4

あなたのコンパイラやシステムは、この記事で使用されているものとは異なっているように見えます。確かに、コードは別の方法で生成されています。

pushpushlは、(潜在的に)異なる量のデータをプッシュしているだけです-チップ内でどの命令にマップされているかについては、アセンブラのドキュメントを確認する必要があります。マシンのオペコードを見ると、そこに役立ちます。Intelのマニュアルは、それを理解するのに役立ちます。同じことがとにmovも当てはまりますmovllそれらが同じである可能性は十分にあり、明確にするために必要のない場合、逆アセンブラは単にオフのままにします。

式は、の値からの0xhexvalue(%register)オフセットでメモリにアクセスしています。Cコードとして想像してみてください。hexvalueregister*(register + hexvalue)

于 2010-06-16T17:08:43.977 に答える
0

正しく覚えていれば、AlephOneの記事は'96年に発表されました。したがって、14年間の開発の後、GCCは実行可能ファイルを異なる方法でビルドするため、効果的なコードは異なります。すべての最適化をオフにして(gcc -O0)、デバッグコードを(gcc -g)にしてコンパイルしてみてください。おそらく、コードは少しクリーンでシンプルになります。

于 2010-06-16T17:28:21.763 に答える