Розыгрыш Premium и Уникальной юзергруппы на форуме! Перейти

Не получается переполнение буффера в учебном примере

0ldB8y
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
8 Дек 2018
Сообщения
133
Реакции
63
Пытаюсь выполнить пример из книги (Искусство эксплойта 2 изд.)
Суть в том что у нас есть буфферы из 8 байт buffer_two и buffer_one , и если передать buffer_two более длинную строку то в buffer_one попадет наш злонамеренный код. Я пытаюсь это сделать, программа падает, но buffer_one остается целым. В чем может быть проблема?


C++:
Expand Collapse Copy
#include <string.h>

int main(int argc, char *argv[])
{
    int value = 5;
    char buffer_one[8], buffer_two[8];

    strcpy(buffer_one, "one"); /* Put "one" into buffer_one. */
    strcpy(buffer_two, "two"); /* Put "two" into buffer_two. */

    printf("[BEFORE] buffer_two is at %p and contains \'%s\'\n",
        buffer_two, buffer_two);

    printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n",
        buffer_one, buffer_one);

    printf("[BEFORE] value is at %p and is %d(0x%08x)\n",
        &value, value, value);

    printf("\n[STRCPY] copying %d bytes into buffer_two\n\n",
        strlen(argv[1]));

    strcpy(buffer_two, argv[1]); /* Copy first argument into buffer_two. */

    printf("[AFTER] buffer_two is at %p and contains \'%s\'\n",
        buffer_two, buffer_two);

    printf("[AFTER] buffer_one is at %p and contains \'%s\'\n",
        buffer_one, buffer_one);

    printf("[AFTER] value is at %p and is %d(0x%08x)\n",
        &value, value, value);
    return 0;
}
 

Вложения

  • 1.png
    1.png
    115 KB · Просмотры: 19
buffer_one - 0x40F930, buffer_two - 0x40F938 == 0x40F930 < 0x40F938 , когда ты записываешь в буффер2 10 байт , 10 байт находится по адресу 0x40F93A.
Соответственно чтобы все получилось как ты хочешь , нужно писать в буффер1 - тогда лишнее 2 байта будут в начале буффера2
 
Последнее редактирование:
buffer_one - 0x40F930, buffer_two - 0x40F938 == 0x40F930 < 0x40F938 , когда ты записываешь в буффер2 10 байт , то 10-й байт находится по адресу 0x40F93A.
Соответственно чтобы все получилось как ты хочешь , нужно писать в буффер1 - тогда лишнее 2 байта будут в начале буффера2
 
Последнее редактирование:
Фак, вместо редактировать , нажал ответить
 
Фак, вместо редактировать , нажал ответить
происходит странная херня, в зависимости от того в какой буффер я пишу,
strcpy(buffer_two, argv[1]); или strcpy(buffer_one, argv[1]);
их адреса меняют старшинство
понимаю ебануто звучит, а может я просто в глаза долблюсь
 

Вложения

  • b1.png
    b1.png
    104.5 KB · Просмотры: 11
  • b2.png
    b2.png
    139.6 KB · Просмотры: 11
C++:
Expand Collapse Copy
void main()
{
    char buf1[8] = "one";
    char buf2[8] = "two";

    std::string str{};

    std::cout << "Enter string: ";
    std::getline(std::cin, str);

    std::cout << "Before: " << buf1 << '\t' << buf2 << std::endl;

    strcpy(buf1, str.c_str());

    std::cout << "After: " << buf1 << '\t' << buf2 << std::endl;
    
    std::cin.ignore();
}

1547109827205.png


Попробуй отключить оптимизацию.
 
C++:
Expand Collapse Copy
void main()
{
    char buf1[8] = "one";
    char buf2[8] = "two";

    std::string str{};

    std::cout << "Enter string: ";
    std::getline(std::cin, str);

    std::cout << "Before: " << buf1 << '\t' << buf2 << std::endl;

    strcpy(buf1, str.c_str());

    std::cout << "After: " << buf1 << '\t' << buf2 << std::endl;
   
    std::cin.ignore();
}

Посмотреть вложение 5900

Попробуй отключить оптимизацию.
Какая у тебя IDE?
 
от настроек компилятора зависит же, там же защита стоит от всего этого ) покопайся
 
от настроек компилятора зависит же, там же защита стоит от всего этого ) покопайся
Не совсем верно , это можно провернуть и с деф. настройками компилятора, зависит какими функциями копирования ты пользуешься, strcpy или strcpy_s, memcpy или memcpy_s и т.д.
 
Не совсем верно , это можно провернуть и с деф. настройками компилятора, зависит какими функциями копирования ты пользуешься, strcpy или strcpy_s, memcpy или memcpy_s и т.д.

и это тоже
 
Назад
Сверху Снизу