Я пытаюсь понять концепцию переполнения буфера, и у меня возникли проблемы с вычислением количества данных, которые нужно заполнить в стеке, чтобы он переполнялся правильно. Предположим, мне предоставлен некоторый код (это не мой код, и да, это класс, но это не градиентное задание): Цель состоит в том, чтобы получить бар, который будет исполнен.Форсирование переполнения буфера для понимания
#include <stdio.h>
#include <string.h>
void foo(char *s) {
char buf[4];
strcpy(buf, s);
printf("You entered: [%s]", buf);
fflush(stdout);
}
void bar() {
printf("\n\nWhat? I was not supposed to be called!\n\n");
fflush(stdout);
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: %s some_string", argv[0]);
return 2;
}
foo(argv[1]);
return 0;
}
Когда я разобрать строку я получаю начальный адрес бара:
(gdb) disas bar
Dump of assembler code for function bar:
0x000000000040062d <+0>: push %rbp
мне сказали, что там должно быть 28 байт данных чучела в буфер, а последние 4 байта, необходимо \x2d\x06\x04\x00
. Где вы получаете 24 байта, чтобы узнать, сколько случайных данных набиты.
В общем, и что меня больше всего интересует, как обобщить и понять это для любой проблемы.
Как вы вычисляете количество байтов, необходимых для заполнения кадра стека, а затем перезаписываете обратный адрес функции?
Примечание: Это написано в C и скомпилирован с GCC 4.4.7
Это упражнение было бы безопаснее, если бы вы сделали это на Java, C# или на каком-либо другом управляемом языке вместо C. Принуждение стека к переполнению на C не было чем-то, что я сделал бы намеренно. –
@RobertHarvey Я узнаю о кибербезопасности, поэтому мне нужно это понять. Я понимаю, что это намеренно не сделано. – bdeo
@RobertHarvey иногда нам нужно быть храбрыми программистами :) –