Я пытаюсь использовать переполнение буфера для перезаписи двух локальных переменных, чтобы я мог вызвать скрытую функцию.Вот код C.
#include <stdio.h>
#include <stdlib.h>
static void hidden_function(void)
{
puts("I laugh in the face of danger. Ha ha ha ha!");
}
static void visible_function(void)
{
puts("Knock, knock! Who's there? Recursion. Recursion who? Knock, knock!");
}
static void helper_function(void)
{
void (*f_ptr)(void) = visible_function;
unsigned int dumb_number = 0x12345678;
char buffer[32];
printf("Provide buffer input: ");
fgets(buffer, 64, stdin);
printf("Dumb number value is 0x%08x.\n", dumb_number);
printf("Buffer is %s\n", buffer);
f_ptr();
}
int main(void)
{
helper_function();
return 0;
}
Я использую этот Makefile.
CC = gcc
CFLAGS = -m32 -Wall -Wextra -Wno-unused-function -g -O0 -fno-stack-protector -no-pie
LDFLAGS = -m32
.PHONY: all clean
all: overflow_ptr
overflow_ptr: overflow_ptr.o
$(CC) $(CFLAGS) -o $@ $<
overflow_ptr.o: overflow_ptr.c
clean:
-rm -f overflow_ptr.o overflow_ptr
-rm -f *~
Запуск nm overflow_ptr показывает мне, что адрес скрытой функции следующий:
080484a6 t hidden_function
Итак, я создал следующую полезную нагрузку:
python3 -c 'print(32*"A" + "\x21\x43\x65\x87" + "\xa6\x84\x04\x08")'
Это должно сделать dump_number = 0x87654321 и f_ptr = 0x080484a6.Однако, когда я запускаю эту программу, вывод:
Provide buffer input: Dumb number value is 0xc2654321.
Что заставляет меня задуматься, почему был вставлен этот c2?Я предполагаю, что это какая-то мера защиты.Если так, есть ли способ предотвратить это?Я использую 64-битную виртуальную машину с Ubuntu.