Запись атаки с возвратом к libc, но libc загружается в память 0x00 - PullRequest
4 голосов
/ 15 октября 2011

Я пишу возврат к libc атаке для класса моей системы безопасности. Во-первых, уязвимый код:

//vuln.c
#include <stdio.h>
#include <stdlib.h>

int loadconfig(void){
  char buf[1024];
  sprintf(buf, "%s/.config", getenv("HOME"));
  return 0;
}

int main(int argc, char **argv){
  loadconfig();
  return 0;
}

Я хочу использовать возврат к libc атаке. Компиляция и отладка программы:

$ gcc -g -fno-stack-protector -o vuln vuln.c
$ gdb vuln
(gdb) break loadconfig
(gdb) run
Reached breakpoint blah blah blah.
(gdb) p $ebp
$1 = (void *) 0xbfffefb0
(gdb) p system
$2 = {<text variable, no debug info>} 0x0016db20 <system>
(gdb) p exit
$3 = {<text variable, no debug info>} 0x001639e0 <exit>
(gdb) x/2000s $esp
...
0xbffff5af:    "SHELL=/bin/bash"

Чтобы выполнить атаку, я хочу переполнить буфер в адрес возврата loadconfig (он же $esp+4), заменив его адресом возврата для system, затем адресом возврата для exit (так как system ожидает реальный адрес возврата), затем имя команды (адрес SHELL=/bin/bash плюс 6, чтобы обрезать часть SHELL=). Это должно быть возможно путем создания переменной среды $HOME из 1024 символов дерьма, а затем адреса с прямым порядком байтов system, exit и /bin/bash.

Однако на каждом компьютере, который я пробовал, system загружается по адресу, начинающемуся с 0x00, что приведет к завершению строки, которую sprintf читает, и остановит атаку мертвой. Есть ли способ заставить libc загружаться в другое место в памяти, или я неправильно истолковываю атаку?

Для справки, я использую виртуальную машину Ubuntu Server 11.10 в VirtualBox (хост Windows) с gcc версия 4.6.1 и gdb версия 7.3-2011.08. редактирование: ASLR отключен, и я скомпилировал с -fno-stack-protector, чтобы удалить канарейку. Поскольку я ничего не выполняю из стека, мне не нужно execstack.

Ответы [ 2 ]

5 голосов
/ 16 октября 2011

Акт отображения важной функции libc на адреса, которые содержат NULL-байт, называется ASCII-защитой. Эта защита является частью RedHat Exec-shield , который в настоящее время включен в последних дистрибутивах Ubuntu link Чтобы отключить его, вы должны запустить от имени пользователя root:

sysctl -w kernel.exec-shield = 0

как объяснено здесь

Кстати, вы можете найти интересный материал о том, как обойти защиту ASCII здесь, на exploit-db

1 голос
/ 15 октября 2011

Я вполне уверен, что это невозможно 11.10, по крайней мере, в тех случаях, которые вы упоминаете.Посмотрите:

https://wiki.ubuntu.com/Security/Features

Подробно, и просто выберите некоторые проблемы с вашими идеями:

(1) из-за канареек и по другим причинам, буферПереполнение в esp + 4 вызовет исключение ошибки сегментации

(2), которое вы, вероятно, имеете в виду, чтобы извлечь адрес переменной среды, которая традиционно была бы в ESP (основной) + определенное количество байтов.Однако, поскольку даже логические адреса памяти в наши дни скремблируются / рандомизируются после компиляции, вы вместо этого будете получать разные адреса памяти для переменной $ HOME для каждого прогона, вероятно, где-то на другой стороне основного стека

(3) насколько мне известно, есть и другие способы, с помощью которых в наши дни отдача от библиотечных атак срывается.Я менее знаком с ними.Вот почему вы видите x00 для адреса

В наши дни взломать систему в системе ubunti сложно.Если вам просто нужно сделать это для класса, который не настаивает на текущих дистрибутивах, установите вместо этого первый дистрибутив ubunti в virtualbox.Волшебно, все, что вы пытаетесь, будет работать.Больше нет «стандартной атаки переполнения», на которую вы также ссылаетесь - даже если вы ловко обходите канареечное значение и т. Д., Установка бита nx делает это невозможным.И точно так же, хотя я менее уверен в том, как реагировать на отдачу от libc-атак, не надейтесь на то, что это будет возможно в текущем дистрибутиве.Удачи!

...