Переполнение буфера - установите соответствующий текст для печати - PullRequest
0 голосов
/ 24 января 2019
#include <unistd.h>

char shellcode[] = "???";

int main(int argc, char* argv[]) {
    int* ret;
    ret = (int*) &ret + 2;
    (*ret) = (int) shellcode;
}

Мне нужно изменить переменную shellCode, чтобы печатать этот год после запуска этой программы. Я понимаю этот код так, что ret указывает на его предыдущий адрес + 2, и он имеет значение адреса, с которого начинается массив shellCode. Но как выглядит стек в этом случае? Я просто не понимаю смысла кода в main() и как здесь работает переполнение буфера.

EDIT Хорошо, мой вопрос не так очевиден, как я думал. Я могу ТОЛЬКО изменить то, что находится внутри shellcode, я не могу ничего добавить к этому коду (кроме изменения shellcode), и результат должен быть 2019 (трактовать это как вывод любого другого числа, т. Е. 2000, номер будет жестко закодирован)

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Предполагается, что:

  1. используется платформа с размером int, равным указателю
  2. UB-код компилируется
  3. Видимо бесполезный код не оптимизируетпрочь
  4. ret = (int*) &ret + 2; будет указывать на адрес возврата в стеке
  5. Ваш компилятор не проверяет безопасность во время выполнения, поэтому атака не предотвращается

В этих случаяхвсе, что вам нужно сделать, это получить указатель на функцию печати текущего года в shellcode переменную

0 голосов
/ 24 января 2019

Мне нужно изменить переменную shellCode, чтобы печатать этот год после запуска этой программы.

Используя strftime , следующий код можно использовать для заполнения shellcode текущим годом (если shellcode создано с достаточным количеством пробелов.):

char shellcode[] = "0000"; //increase space for 4 characters + nul.

...  

time_t t;
struct tm* tm_info;
time(&t);
tm_info = localtime(&t);
strftime(shellcode, 5, "%Y", tm_info); //populate shellcode with year.
printf("%s\n", shellcode);             //write current year to stdout

Как я уже упоминал в комментариях, я не уверен, что вы делаете в основной функции, но если вы намеревались получить целочисленную версию текущего года, вы можете последовательно объединить строковые результаты strftime с функцией strtol для преобразования строки в числовое значение:

char *temp = null;
long int year = strtol(shellcode, &temp, 0); 

Но обязательно проверьте ошибки конвертации. например:

if(temp == shellcode|| ((year == LONG_MIN || year == LONG_MAX) && errno == ERANGE))
{
    //handle error
}
...