В настоящее время я читаю «Взломать искусство эксплуатации», где говорится об уязвимостях строки формата.Упражнение книги пытается прочитать данные из произвольной части памяти, записав адрес в стек и прочитав его, используя параметры формата.Проблема в том, что упражнение написано для 32-битных систем, а я работаю на 64-битных.Моя попытка заставить его работать для 64-битной системы приведена ниже:
Правильный способ печати под контролем пользователяввод:
?????% 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);
}
Вот снимок экрана моей оболочки: