У меня есть маленький вопрос. Я знаю, что спецификатор формата% x можно использовать для чтения значений из стека в атаке строки формата.
Я нашел следующий код:
%08x%08x%08x%08x
Что означает 08? Что он делает точно? Спасибо:)
У меня есть маленький вопрос. Я знаю, что спецификатор формата% x можно использовать для чтения значений из стека в атаке строки формата.
Я нашел следующий код:
%08x%08x%08x%08x
Что означает 08? Что он делает точно? Спасибо:)
Break-вниз:
8
говорит, что вы хотите показать 8 цифр0
, который вы хотите префикс 0
вместо просто пробеловx
, который вы хотите распечатать в младшем шестнадцатеричном формате.Быстрый пример (спасибо Гриджешу Чаухану):
#include <stdio.h>
int main() {
int data = 29;
printf("%x\n", data); // just print data
printf("%0x\n", data); // just print data ('0' on its own has no effect)
printf("%8x\n", data); // print in 8 width and pad with blank spaces
printf("%08x\n", data); // print in 8 width and pad with 0's
return 0;
}
Выход:
1d
1d
1d
0000001d
Также см. http://www.cplusplus.com/reference/cstdio/printf/ для справки.
Указывает, сколько цифр вы хотите отобразить.
целочисленное значение или *, указывающее минимальную ширину поля. Результат дополняется символами пробела (по умолчанию), если требуется, слева, если это правильно, или справа, если левостороннее. В случае, когда * используется, ширина указана дополнительным аргументом типа int. Если значение аргумента отрицательное, оно приводит к заданной и положительной ширине поля.
%08x
означает, что каждое число должно быть напечатано не менее 8 символов с заполнением всех отсутствующих цифр нулями, например. для выхода "1" будет 00000001
Из http://en.wikipedia.org/wiki/Printf_format_string
используйте вместо 0 вместо пробелов поле для заполнения поля, когда указан параметр ширины. Например, printf("%2d", 3)
приводит к "3", а printf("%02d", 3)
приводит к "03".