C (s) printf эксплойт, $ hn и% 10 - PullRequest
0 голосов
/ 18 декабря 2018

при попытке следовать руководству по строковым эксплойтам в C у меня возникли следующие вопросы, на которые я, похоже, не нашел ответа.

  1. "Если мы передадим строку AAAA%10 $ n, мы бы записали значение 4 по адресу 0x41414141! ".Это выдержка из учебника .Но почему мы пишем 4?Я понимаю, что AAAA в hex становится 0x41414141, но затем записывается% 10 $ n.Что означает эта цифра 10, что означает этот доллар и откуда взята четверка?
  2. Окончательное решение проблемы использования варгейма приведено ниже.Однако кажется, что я могу полностью отбросить% 238x (для чего вообще это было нужно?), И здесь конец строки равен% 10 $ hn.что здесь означает «хн»?Справочная документация C обозначает «hn» как «unsigned short *».Это даже тип данных?

$(python -c 'print "\x40\x99\x04\x08%238x%10$hn"')

1 Ответ

0 голосов
/ 18 декабря 2018

1) %10$n не записано , это спецификатор формата.И у него нет выходных данных, но есть только побочный эффект - записать количество выведенных символов до этого спецификатора в целое число, предоставленное 10-м аргументом для printf.Поскольку вы не предоставили 10 аргументов для printf, он выбирает что-то другое из стека и использует его в качестве адреса.Похоже, что в руководстве предполагается, что AAAA находится там и интерпретируется как адрес 0x41414141.

2) %hn означает не запись целого числа (обычно 4-байтового), а только короткое значение (обычно2 байта) по указанному адресу.Проще написать 2 2-байтовых значения с помощью этого метода вместо 1 4-байтового значения, поскольку для записи нужного значения вам пришлось печатать до 4M символов.

...