У мене маленьке запитання. Я знаю, що специфікатор формату% x можна використовувати для зчитування значень зі стеку під час атаки рядка формату.
Я знайшов такий код:
%08x%08x%08x%08x
Що означає 08? Що саме робить? Дякую :)
У мене маленьке запитання. Я знаю, що специфікатор формату% x можна використовувати для зчитування значень зі стеку під час атаки рядка формату.
Я знайшов такий код:
%08x%08x%08x%08x
Що означає 08? Що саме робить? Дякую :)
printf()
, що використовується.
Відповіді:
Зламатися:
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/ .
%-8x
і капіталом X
. і спостерігати за ефектом
8
і 0
є обома цифрами (і, отже, однаковими частинами граматики англійською мовою), вони є різними частинами граматики формату printf. 0
є «прапор» , і 8
є параметром «ширина» (який може бути <ε (no input)>
, <d (any number greater than 0)>
або * (a literal asterisk)
). Це, безумовно, неінтуїтивний API! Але що не скажеш ... це все старомодні речі C, де пам’ять була такою преміум-категорією, що ти хочеш зберегти якомога більше символів у програмі - я погоджуюся з їх рішенням, враховуючи обмеження, з якими вони стикалися!
printf
синтаксис? Мені подобається використовувати %
в якості символу втечі, він такий унікальний і нішевий для форматування рядків. Я думаю, що модифікатори слід додавати, а не додавати , але таким чином ви можете читати їх зліва направо. Щось на зразок %<specifier>[%f<flags>][%-w<width>.<precision>]%
, замість %[flags][width][.precision][length]specifier
. Я вибрав %
між кожним полем, а також одне для закриття (так що ви все ще можете зробити %x%x
- `% x %% x%) і дозволяє вказати специфікатор із декількома
Це вказує, скільки цифр ви хочете показувати.
ціле число або *, що визначає мінімальну ширину поля. Результат заповнюється пробілами (за замовчуванням), якщо потрібно, ліворуч, якщо вирівняно праворуч, або праворуч, якщо вирівняно ліворуч. У випадку, коли використовується *, ширина визначається додатковим аргументом типу int. Якщо значення аргументу від'ємне, це призводить до вказаного прапора - і додатної ширини поля.
З http://en.wikipedia.org/wiki/Printf_format_string
використовуйте 0 замість пробілів для заповнення поля, коли вказано параметр ширини. Наприклад, printf("%2d", 3)
результати в "3", а printf("%02d", 3)
результати в "03".
Атака рядка форматування на printf, про яку ви згадали, не характерна для форматування "% x" - у будь-якому випадку, коли printf має більше параметрів форматування, ніж передані змінні, він буде зчитувати значення зі стеку, які йому не належать. Ви отримаєте те саме питання з% d, наприклад. % x корисний, коли ви хочете бачити ці значення як шістнадцяткові.
Як пояснювалось у попередніх відповідях,% 08x видасть 8-значне шістнадцяткове число, заповнене попередніми нулями.
Використовуючи форматування у прикладі коду в printf, без додаткових параметрів:
printf ("%08x %08x %08x %08x");
Витягне 4 параметри зі стеку та відобразить їх як 8-значні заповнені шістнадцяткові числа.
000007ac
або0005ceef
.