printf символа NOP 0x90 отличается при компиляции на x86_64 и i686

У меня 2 системы:

  1. 3.13.0-35-generic... x86_64 x86_64 x86_64 GNU / Linux с gcc: 4.8.2
  2. 2.6.32-21-generiC#32-Ubuntu ... i686 GNU/Linux с gcc: 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, часть NOP вывода printf() содержит дополнительные странные символы, а именно:

Система 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] Почему это?

Благодарю.

2 ответа

Решение

Рассмотреть вопрос printf() сколько именно NOP для печати:

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

Это позволяет избежать проблемы, заключающейся в том, что вы не завершили строку нулем.

(Обратите внимание, что строго %.*s нотация говорит printf() отформатировать до numOfNops символов или до первого нулевого байта в качестве выходных данных спецификации преобразования. Если у вас есть солидный массив значений NOP, как в вопросе, это то же самое, что сказать printf() распечатать точно заданное количество значений NOP.)

Ваш буфер не равен NUL '\0', поэтому вы печатаете символы, которые находятся за самим буфером.

Я бы предложил попробовать добавить nops[numOfNops - 1] = '\0'; перед вызовом printf.

Другие вопросы по тегам