3

小さな (そして脆弱な) C サンプルがあります。

#include <unistd.h>

int main(int argc, char *argv[])
{
    char buff[100];

    if(argc < 2)
    {
        printf("Syntax: %s <input string>\n", argv[0]);
        exit (0);
    }

    strcpy(buff, argv[1]);
    return 0;
}

私はそれをコンパイルしました:

gcc -o basic_overflow basic_overflow.c -fno-stack-protector -fno-builtin

このプログラムを gdb で開くと、逆アセンブルは次のようになります。

Dump of assembler code for function main:
   0x08048424 <+0>: push   ebp
   0x08048425 <+1>: mov    ebp,esp
   0x08048427 <+3>: and    esp,0xfffffff0
   0x0804842a <+6>: add    esp,0xffffff80
...

main にブレークポイントを設定します (プロローグの後)。ローカル バッファーがあるため、スタック フレームのサイズは 100 バイトになると予想されます。しかし、$ebp-$esp を実行すると、結果が実際には 136 であることがわかります。

プラットフォーム:Linux user-VirtualBox 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 03:31:50 UTC 2011 i686 i686 i386 GNU/Linux

コンパイラ:gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 デバッガ:GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2 何が間違っていたのでしょうか?

4

2 に答える 2

4

ローカル変数のサイズだけではありません-一般的に言えば、プラットフォームABI、破壊されたレジスタ、alloca()領域によって指定されたサイズへのパディングがあります...-たとえば、この素敵な写真を確認してください

于 2012-11-25T23:16:41.387 に答える
0

バッファアドレスを取得するのは非常に困難です。この質問もあります。スタックを粉砕する方法を教えてくれる良い記事があります。 しかし、私のコンピューターでは、ubuntu 12.04、gcc 4.6 または 4.4.7 で、最新の Eggshell.c をテストしましたが、結果はコア ダンプです。彼はシェルコードを環境変数に入れます。しかし、環境変数のアドレスを見つける必要がありました。また、スタックを壊しても効果がないこともあります。

于 2012-11-27T13:57:32.777 に答える