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

Простой эксплоит переполнения буфера не работает( - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Capricorn
Сообщений: n/a
11.03.2013, 10:29     Простой эксплоит переполнения буфера не работает( #1
Здравствуйте, есть простая программа использующая уязвимость переполнения буфера, по сути должна просто закрываться при выполнении и не выводить ошибок, но этого не происходит. "\xd8\x69\x83\x7c" - адрес call esp определен с помощью OllyDbg и равен 0x7c8369d8, адрес функции ExitProcess также узнал с помощью OllyDbg и он равен 0х7c81cb12. Скажите какие могут причины того что код не выполняется как надо? Код приведен ниже.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// vuln_exe.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <stdio.h>
 
void show_array(int arrlen, char array[])
{
    char buffer[32];
    int i;
 
    for (i = 0; i < arrlen; i++) buffer[i] = array[i];
    printf(buffer);
}
 
int main()
{
    char mystr[] = "111112222233333444445555566666777778"
                   "\xd8\x69\x83\x7c"
                   "\xff\x15\x12\xcb\x81\x7c";
    show_array(47, mystr);
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2013, 10:29     Простой эксплоит переполнения буфера не работает(
Посмотрите здесь:

Почему такой простой алгоритм работает неправильно? C++
WTF не работает простой код на Visual studio 2008(баг?) C++
C++ Ошибка переполнения буфера
C++ Не работает простой цикл
C++ Отлов исключения переполнения буфера
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SEGNET
26 / 26 / 4
Регистрация: 28.12.2012
Сообщений: 224
12.04.2013, 23:54     Простой эксплоит переполнения буфера не работает( #2
Тоже интересует данный сабжект.
Миниатюры
Простой эксплоит переполнения буфера не работает(  
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
13.04.2013, 04:08     Простой эксплоит переполнения буфера не работает( #3
что характерно проблема существует и linux, но мой linux оказался более разговорчивым )

в режиме Clang пишет -

Disallowed system call: SYS_socketcall

компилятор gcc 4.6.2 - прога падает с текстом
stderr:
*** stack smashing detected ***: program terminated

компилятор gcc 4.7.3 - прога вообще не падает, всё отлично отрабатывает
Exit status: 0

других нет)
но нашёл я ответ на ваш вопрос )

здесь в разделах 0x08 и 0x09 расписывается происходящее в этой программе
http://big-daddy.fr/repository/Docum...curity/431.pdf

а вообще лучше всё это с нуля читать ) очень позновательный приём
ssXXss
263 / 185 / 10
Регистрация: 15.01.2011
Сообщений: 668
13.04.2013, 04:21     Простой эксплоит переполнения буфера не работает( #4
Capricorn а какая ось?
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
13.04.2013, 04:36     Простой эксплоит переполнения буфера не работает( #5
Цитата Сообщение от ssXXss Посмотреть сообщение
Capricorn а какая ось?
а там без разницы ось - происходит переполнение буфера и всё тут, так вот программа написанна, почему вас не смущает когда обычные...

штуки подобного плана
C++
1
2
3
4
5
6
7
#include <stdio.h> 
#include <string.h> 
int main(int argc, char* argv[]) { 
 char y[32]; 
 strcpy(y, argv[1]); 
 return (0); 
}
переполняют буфер и грохаются?

единственное отличие в винде (они пишут про Win32) дальше в kernel32.dll (то что у них указан адрес 0x7c8369d8) можно впарить любой код на исполнение, а как бы в linux туда уже ничего не встроишь, а просто грохнешь программу....

тут история такая же

здесь
C++
1
char buffer[32];
выделяется буфер на 32 элемента
а здесь в него же пишется
C++
1
for (i = 0; i < arrlen; i++) buffer[i] = array[i];
обратите внимание arrlen = 47 аргументов

это должно грохнуться на любой операционке, и в WinXP грохается, но при этом когда переходит обращение к ядру - ядро винды вынимает из стека твой адрес на твой код и исполняет, считая что это адрес какой-то системной функции (это я грубо описал, более детально в этой статье)

в любом случае вне зависимости от операционок - этот код грохнется, что тут такого то?
ssXXss
263 / 185 / 10
Регистрация: 15.01.2011
Сообщений: 668
13.04.2013, 04:57     Простой эксплоит переполнения буфера не работает( #6
разница просто огромная, хотя бы в способе обработки исключительных ситуаций, также существует защита от выполнения кода в стеке, ну куча других фич.

http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx
http://www.xakep.ru/magazine/xa/134/060/1.asp

Добавлено через 7 минут
+ к этому начиная с висты подгружаемые dll не имеют постоянных адресов загрузки , а обращение к ядру windows происходит через системные сервисы, и то что было актуально для хр для более поздних ос уже не применимо, конечно есть исключения но к данному случаю они не имеют ни какого отношения.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
13.04.2013, 05:05     Простой эксплоит переполнения буфера не работает( #7
Цитата Сообщение от ssXXss Посмотреть сообщение
разница просто огромная, хотя бы в способе обработки исключительных ситуаций, также существует защита от выполнения кода в стеке, ну куча других фич.

http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx
http://www.xakep.ru/magazine/xa/134/060/1.asp
да это тут причём...

автор пишет
по сути должна просто закрываться при выполнении и не выводить ошибок, но этого не происходит.
она ни в какой нормальной среде не должна не выдавать ошибок, потому что пишет в память buffer[32] больше того, что там есть

как уверяют в статье работает для winxp sp2
а все эти " обработки исключительных ситуаций, также существует защита от выполнения кода в стеке, ну куча других фич. " никак не спасают и в статье говорят почему

Добавлено через 6 минут
да, исключительно для WinXP SP2 (начало 0x09 параграфа)

Since we are using a Windows XP SP2 (Intel x86) system, it is
necessary that we write our shellcode
ssXXss
263 / 185 / 10
Регистрация: 15.01.2011
Сообщений: 668
13.04.2013, 05:11     Простой эксплоит переполнения буфера не работает( #8
под рукой нет хр , но предположу что(если использовалась visual studio ) проект был собран с дефолтными настройками т.е. выставлена проверка безопасности, использование с++ исключений, включена оптимизация и др. настройки и студия сама дописывает то что считает нужным.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2013, 09:02     Простой эксплоит переполнения буфера не работает(
Еще ссылки по теме:

Динамическое обнаружение ошибки переполнения буфера C++
C++ Избавиться от переполнения буфера (asm)
Не работает cin.getline при считывании строки большей буфера C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
SEGNET
26 / 26 / 4
Регистрация: 28.12.2012
Сообщений: 224
13.04.2013, 09:02     Простой эксплоит переполнения буфера не работает( #9
Для интереса попробовал реализовать на асм, то есть просто запихал в стек значения адресов и программа выполнилась. По всей видимости это как то связано с безопасностью о чем упоминает ssXXss
Yandex
Объявления
13.04.2013, 09:02     Простой эксплоит переполнения буфера не работает(
Ответ Создать тему
Опции темы

Текущее время: 12:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru