printf символа NOP 0x90 отличается при компиляции на x86_64 и i686
У меня 2 системы:
- 3.13.0-35-generic... x86_64 x86_64 x86_64 GNU / Linux с gcc: 4.8.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".
- Когда я запускаю его на 64-битной системе #1, вывод выглядит точно так, как я хочу.
- Когда я запускаю его в 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.