1

この情報源は、Jon Erickson の著書Hacking: The Art of Exploitationで見つけました。

userid = getuid(); // get the real user ID
// Writing data
if(write(fd, &userid, 4) == -1)  // write user ID before note data
    fatal("in main() while writing userid to file");
write(fd, "\n", 1); // terminate line

このコードをコンパイルしようとしたところ、私が書いたファイルの userid (上記のコードで書いたもの) が正しくないことがわかりました。彼らは奇妙な文字を書いただけです(ここに書くことは重要ではないと思います)。intしたがって、問題は、 を必要とする関数にを渡そうとしてchar *いることです。そのため、書き込みたいファイルの結果が false です。

これはバグですよね?

4

2 に答える 2

5

この関数は、そのバッファーにwrite()a を想定しています。void *任意のバイナリ データを書き込みます。文字列への変換が必要な場合は、 を使用しますprintf()

の宣言は表示されませんuseridが、write()行は次のように記述される必要があります。

if (write(fd, &userid, sizeof(userid)) != sizeof(userid))

これにより、短い書き込み (整数型では問題になる可能性は低い) やその他の問題が検出され、 の型に関係なく正しく機能しuseridます。したがって、この行の元のバージョンは間違いなくバグがあります。それ以外の場合、バグはコード自体ではなく、期待どおりのようです。

于 2013-02-09T16:01:26.220 に答える
2

いいえ、これはバグではなく、あなたの誤解です。このwrite呼び出しは、メモリ内にあるもの、つまりバイナリ表現を書き込むだけです。fprintf読み取り可能なバージョンを取得するには、次のようなものが必要です。

たとえば、7 のバイナリ表現は 0、0、0、および 7 の 4 バイトである可能性があり、テキスト表現である単一バイト 55 (ASCII と仮定) のようには見えません。

移植性がないため、整数の 4 のような型の長さをハードコーディングすることもお勧めできません。のようなものを使用する方がよいでしょうsizeof(userid)

于 2013-02-09T16:02:55.283 に答える