Как получить адрес из эксплойта формата строки, который принимает только десятичные дроби? - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь получить адрес функции, используя уязвимость формата строки. У меня есть указатель функции с именем 'exit', который указывает на функцию A. Мне нужно сделать так, чтобы точка 'exit' указывала на другую функцию B, которая находится на некотором смещении адреса от A (в данном случае это 32 удаленных десятичных адреса). Для того, чтобы сделать это, мне нужно установить значение по адресу «exit» в качестве адреса B. Моя проблема: я не знаю начальное значение «exit» (которое также является адресом A), поэтомуМне нужно использовать строковый формат, чтобы попытаться найти адрес A.

Я начинаю с начала беззнакового буфера символов длиной 44 байта. Предположим, указатель 'exit' находится в буфере [48] (я просто упрощаю задачу). Я делаю переполнение буфера для достижения P. По пути, у меня по существу 48 итераций случайных чисел, в то время как я пересекаю цикл for в атаке переполнения буфера.

Scanf ниже запрашивает числовой ввод отПользователь. Когда я ввожу "% x" или "% d" или любой другой вид злоупотребления форматом, я не могу вернуть адрес, и программа завершается. Возможно ли использовать уязвимость строкового формата, когда вход ожидает только число?

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

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

struct container {
    unsigned char buffer[44];
    void (*exit)();
};

void B() {
    puts("You've executed the correct function!");
}

void A() {
    puts("Wrong function");
}

int main() {
    struct container * my_container = malloc(sizeof(struct container));
    memset(my_container->buffer, 0, 44);
    my_container->exit = &A;

    for (int i = 0; i < 50; i++) {
        printf("What number goes into the buffer at index %d? ", i);
        unsigned int input_num;
        scanf("%d", &input_num);
        if (input_num == 0) {
            break;
        }
        my_container->buffer[i] = input_num & 0x000000ff;
    }

    my_container->exit();
    free(my_container);
}

Я ожидал, что на выходе «% x» будет адрес текущей позиции указателя стека. Вместо этого он завершает программу.

...