記事はここにあります。
私はスタックを壊すことを読んでいて、example3.cで立ち往生していることに気づきました。
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
著者は、からにスキップしたいこと、0x80004a8
および0x80004b2
このジャンプは8バイトであることを示しています。著者はこれが8バイトであるとどのように判断しましたか?コードを再作成して送信したobjdump
ところ、8バイトではないことがわかりました(64ビットマシンを使用していますが、32ビットを使用してコンパイルするようにしています)。
8048452: e8 b5 ff ff ff call 804840c <function>
8048457: c7 44 24 1c 01 00 00 movl $0x1,0x1c(%esp)
804845e: 00
804845f: 8b 44 24 1c mov 0x1c(%esp),%eax
8048463: 89 44 24 04 mov %eax,0x4(%esp)
8048467: c7 04 24 18 85 04 08 movl $0x8048518,(%esp)
著者はまた、「差出人住所に8を追加することをどのようにして知ったのですか?最初にテスト値を使用しました(たとえば1)」と述べました。彼はどこでこのテスト値を使用しましたか?