Перезаписать значение в памяти, введя пользовательский ввод - PullRequest
0 голосов
/ 20 октября 2019

Это связано с атакой с разбивкой стека.

По сути, я пытаюсь разбить стек, предоставляя программе определенный ввод. Программа принимает пользовательский ввод, как это, используя getchar:

for (i = 0; (c = getchar()) != '\n'; i++) buf[i] = c;

Я хочу перезаписать память, чтобы стать 0x000000a1. К сожалению, 0xa1 не является символом ascii, поэтому я не могу просто ввести что-то вроде ¡ (перевёрнутый восклицательный знак), потому что это в итоге дает 0x0000a1c2 в памяти. Как я могу переписать значение, равное 0x000000a1, не меняя способ обработки пользовательского ввода в программе?

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Информация о вашей системе не предоставляется, но обычно стандартный ввод - это просто поток байтов. Это означает, что вы можете отправлять произвольный поток байтов, а не только действительные символы.

Например, если ваша программа-жертва ./a.out, вы можете создать программу для выдачи полезной нагрузки

#include <stdio.h>

int main(void) {
    putchar(0xa1);
    putchar('\n'); /* to have the victim finish reading input */
    return 0;
}

и скомпилируйте, например, ./b.out и выполните с использованием канала

$ ./b.out | ./a.out

($ - подсказка вашего терминала)

1 голос
/ 20 октября 2019

Вы можете использовать bash для ввода произвольных символов:

echo -e '\xA1' | /path/to/program

Вы можете добавить дополнительный ввод, поместить эхо в цикл и т. Д.

echo -e 'Something\xA1\xA1\xA1' | /path/to/program

...