Я пытаюсь получить адрес функции, используя уязвимость формата строки. У меня есть указатель функции с именем '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» будет адрес текущей позиции указателя стека. Вместо этого он завершает программу.