2

私はubuntu12のターミナルを使用してこれをコンパイルしようとしています:

#include <stdio.h>

#include <stdlib.h>

main()

{
    /*declare argument array*/
    char *args[2];

    args[0] = “/bin/bash”;
    args[1] = NULL;

    execve(args[0], args, NULL);

    exit(0);
}

この例はhttp://www.securitytube.net/video/235で見つけました。これは、AlephOneが「SmashingtheStack forFunandProfit」で使用したものでもあります。それ以来、多くの変化があったことを私は知っています。より簡単な例では、次のように使用しました。

gcc -ggdb -mpreferred-stack-boundary = 2 -fno-stack-protector filename filename.c

また、静的ユーティリティを含める場合もあります。上記のCコードをコンパイルしようとするまではうまくいきました。ターミナルから受け取るメッセージは次のとおりです。

ss@ss-laptop:~$ gcc -static -mpreferred-stack-boundary=2 -fno-stack-protector -o shell         shell.c
shell.c: In function ‘main’:
shell.c:9:2: error: stray ‘\342’ in program
shell.c:9:2: error: stray ‘\200’ in program
shell.c:9:2: error: stray ‘\234’ in program
shell.c:9:15: error: expected expression before ‘/’ token
shell.c:9:15: error: stray ‘\342’ in program
shell.c:9:15: error: stray ‘\200’ in program
shell.c:9:15: error: stray ‘\235’ in program
ss@ss-laptop:~$

これは非常に単純な例であり、このエラーはおそらくLinuxの現在の標準的なセキュリティ対策が原因であると理解していますが、今後はこの例などを使って練習していきたいと思います。誰かが助けることができれば、それは「粉砕」になります。

乾杯

4

3 に答える 3

4

文字列リテラルの周りに「スマート」な引用符があります。

“/bin/bash”;

通常の引用符を使用してみてください"

于 2012-07-04T19:23:35.487 に答える
2

これはセキュリティとは何の関係もないと思いますが、代わりに次の行です。

args[0] = “/bin/bash”;

文字列を区切るために使用している引用文字は、標準のASCII引用文字ではありません。代わりに、引用符としてはかなりUnicode文字です。

これを次のように書き直してみてください

args[0] = "/bin/bash";

引用符を新しい二重引用符に置き換えます。

余談ですが、コンパイラがシェルコードを起動する可能性のあるすべてのプログラムを検出することはおそらく不可能です。セキュリティホールのためにプログラムのコンパイルを停止するために標準のコンパイラが何かをするなら、私はショックを受けるでしょう。

お役に立てれば!

于 2012-07-04T19:23:11.683 に答える
0

皆様の迅速な対応に感謝します。私はいくつかのことを学びました:

1)コピーアンドペーストは愚かです

2)コピーアンドペーストしないでください

3)とにかく引用符を確認してください

答えは引用符でした。削除してもう一度入力しました。*はぁ。

乾杯

私は初心者です-私はそれを認める最初の人です。

于 2012-07-05T08:53:36.763 に答える