Изменение целого числа с переполнением буфера - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь изменить целое число в структуре, используя переполнение буфера, но я не могу понять, в каком формате хранится целое число.

Я сделал некоторый тестовый код:

    struct {
    char beginningWord[3];
    int32_t middleInt;
    char endingWord[3];
} testStruct;

testStruct.middleInt = 5;
strcpy(testStruct.endingWord, "123");
strcpy(testStruct.beginningWord, "AAAA0000FFF");

Это меняет значение endWord со «123» на «FFF», а целое число от 5 до 808464432. Что мне следует перезаписать в целые слоты памяти, чтобы изменить его, например, на 9?

1 Ответ

0 голосов
/ 28 сентября 2018

9 правильной ширины (32 бита) не может быть надежно скопировано strcpy.Это будет выглядеть в шестнадцатеричном виде:

00000009

Обычно это будет храниться в памяти таким образом (называется Little Endian)

09 00 00 00

Это не строка, состоящая из символов0 'и' 9 ', это четыре байта со значениями 9 и 0.

09 и первый 00 можно скопировать с помощью strcpy, но затем strcpy останавливается, поскольку 00сигнализирует конец строки.Таким образом, два байта целого числа (и endingWord) не записываются и сохраняют свое предыдущее значение.Результирующее значение не будет 9, если старшие байты отличны от нуля для начала.memcpy может надежно копировать такие данные, включая «неконечные» нули.

Как символ, 09 будет интерпретироваться как (или записываться как) \t (символ табуляции) вкодировка ASCII.

...