0

私は2つのシステムを持っています:

  1. 3.13.0-35-generic ... x86_64 x86_64 x86_64 gcc を使用する GNU/Linux: 4.8.2
  2. 2.6.32-21-generic #32-Ubuntu ... gcc を使用する i686 GNU/Linux: 4.4.3

両方のシステムで次のコードをコンパイルしました。

int numOfNops = 600;
unsigned char nops[numOfNops];
int i;
for (i=0; i < numOfNops; i++) {
    nops[i] = '\x90';
}
...
printf("GET /%s%s\x90\x90%s HTTP/1.0 \n", nops, buf, ESPs);

問題は、「nops」配列の印刷です。

  1. 64 ビット システム #1 で実行すると、出力は希望どおりに表示されます。
  2. 32 ビット システム #2 で実行すると、printf() 出力の NOP 部分に追加の奇妙な文字が含まれます。

Hexdump システム #1

00000250  90 90 90 90 90 90 90 90  90 90 90 90 90 89 e3 da  |................|
00000260  c4 d9 73 f4 5f 57 59 49  49 49 49 49 49 49 49 49  |..s._WYIIIIIIIII|

Hexdump システム #2:

00000250  90 90 90 90 90 90 90 90  90 90 90 90 90 24 c5 12  |.............$..|
00000260  89 e3 da c4 d9 73 f4 5f  57 59 49 49 49 49 49 49  |.....s._WYIIIIII|

したがって、追加の文字は 0x24 0xc5 0x12 です。

[Q] それはなぜですか?

ありがとう。

4

2 に答える 2

7

バッファは NUL '\0' で終了していないため、バッファ自体を過ぎた文字を出力しています。

nops[numOfNops - 1] = '\0'; を追加してみることをお勧めします。printf を呼び出す前に。

于 2014-09-20T17:54:37.663 に答える
4

printf() 出力する NOP の正確な数を指定することを検討してください。

printf("GET /%.*s%s\x90\x90%s HTTP/1.0 \n", numOfNops, nops, buf, ESPs);

これにより、文字列を null で終了しなかったという問題が回避されます。

(厳密には、変換仕様の出力として、文字まで、または最初の null バイトまでを書式設定するように%.*s表記法が指示していることに注意してください。質問のように NOP 値の固体配列がある場合、これは印刷するよう指示するのと同じです。指定された NOP 値の正確な数)。printf()numOfNopsprintf()

于 2014-09-20T18:22:05.357 に答える