Простое переполнение кучи в программе на C

Я делаю простой пример переполнения кучи: при компиляции кода я использую флаги -m32, -no-pie, -fno-stack-protector и -z execstack. Я могу вызвать сбой программы, если просто отправлю строку прямо с терминала. Например, «АААААА....ААА», но когда я пытаюсь использовать python2, программа не выходит из строя, хотя я использую очень большое количество букв «А».

Пример:

./exe 'python2 -c"print 'A'*100"'

Код С:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define BUFFER_SIZE 32

int main(int argc, char** argv)
{
    char *a = malloc(BUFFER_SIZE);
    char *b = malloc(BUFFER_SIZE);
    
    strcpy(a, argv[1]);
    
    free(a);
    free(b);
    return 0;
}

Я пробую следующие команды:

./simple 'python2 -c"print A*100"'
./simple python2 -c"print A*100"
./simple 'python2 -c"print 'A'*100"'
./simple python2 -c"print 'A'*100"
./simple python2 -c"print('A'*100)"

Это на виртуальной машине с Ubuntu 22.04.4 LTS и python 2.7.18.

Я могу создать переполнение, вручную набрав много букв A или создав скрипт Python.

Прошу прощения за неточность, это мой первый вопрос.

Я пытаюсь отправить команду python2 в разных формах. Я также пытаюсь напрямую использовать полезную нагрузку, что-то вроде ./simple < payload. но это всегда приводит к сбою программы независимо от того, сколько букв A содержится в полезной нагрузке.

Пожалуйста, отредактируйте свой вопрос и опубликуйте свой настоящий код C. То, что вы опубликовали, - это не код C, а псевдокод.

Craig Estey 05.04.2024 03:24

Не помечайте C++ для вопросов C.

Eric Postpischil 05.04.2024 03:28

Одинарные кавычки не выполняют команду. Для этого вам нужны обратные кавычки. Как сейчас написано, вы отправляете 23-байтовую строку python2 -c"print A*100" в свою программу. Об этом вам скажет очень элементарная отладка. Например: printf("(%s)\n", argv[1]);

paddy 05.04.2024 03:32

мой python3.12 также говорит, что его нужно заключить в круглые скобки print('A'*100)

yano 05.04.2024 04:43

@yano, текст вопроса указывает на то, что ОП использует Python 2.x, где скобки не требуются с print.

Chris 05.04.2024 06:03

Поэтому я пробую следующие команды: ./simple 'python2 -c"print A*100"'./simple python2 -c"print A*100"./simple 'python2 -c"print 'A'*100"'./simple python2 -c"print 'A'*100"./simple python2 -c"print('A'*100)" Ни одна из них не работает, я смог выполнить эксплойт напрямую, отправив сообщение из скрипта Python.

Erik Guaderrama 05.04.2024 07:15

Пожалуйста, внимательно прочитайте комментарий @paddy, он указывает вам правильное направление. Посмотрите документацию, как выполнить внутреннюю команду и использовать ее вывод в виде текста во внешней команде. -- Вместо вашей программы используйте echo, чтобы увидеть результат.

the busybee 05.04.2024 07:54

Как вы ожидаете, что эти другие варианты будут работать, если они содержат ту же ошибку, упомянутую Пэдди, что и ваш первоначальный вариант? Вы добавили отладку, упомянутую Яно? Он должен сразу сказать вам, что не имеет значения, сколько A вы пытаетесь предоставить, потому что вся ваша настройка неверна.

Gerhardh 05.04.2024 13:28

Мы понимаем, что во многих шрифтах они могут выглядеть одинаково, но ' и ` на самом деле не являются одним и тем же символом, и оболочка обрабатывает их по-разному. Прочтите комментарий Пэдди еще раз.

Useless 05.04.2024 20:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
./simple 'python2 -c"print A*100"'

Запускает вашу программу с установленным argv[1] в строке python2 -c"print A*100".

Вы можете и должны проверять, что на самом деле происходит в вашей программе, каждый раз, когда это вас удивляет, с помощью одного или нескольких из:

  • Добавление операторов печати, чтобы ваша программа могла подтвердить свое внутреннее состояние, соответствует вашим ожиданиям, например:

     printf("argc=%d, argv[1]=%s\n", argc, argv[1]);
    
  • Отладка с помощью GDB или любого другого доступного отладчика. Если вы не знаете, как его использовать, самое время научиться. Если вы даже не знали, что он существует, то, где бы вы ни изучали C, это ужасно.

У всех есть ошибки. Каждый учится отлаживать свой код. Это нормально и ожидается, что вы приложите некоторые усилия, чтобы понять, что на самом деле делает ваша программа (и здесь я включаю конвейер оболочки, который является вашей настоящей проблемой: это тоже код).

./simple < payload

это просто совершенно неправильно. Перенаправление ввода меняет то, к чему подключен stdin, но вообще не влияет на argv. Прочтите документацию к вашей оболочке, чтобы узнать, какой еще синтаксис может быть полезен.

Другие вопросы по теме