0 / 0 / 0
Регистрация: 24.10.2013
Сообщений: 89
1

Переполнение буфера, адрес возврата

23.03.2015, 18:39. Показов 9407. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите пожалуйста, где можно найти адрес возврата при переполнении буфера. Visual Studio 2012 windows 8.1
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2015, 18:39
Ответы с готовыми решениями:

Переполнение буфера
Объясните почему вылетает ошибка и помогите исправить. Зарание спасибо возникло переполнение...

Переполнение буфера
В программе имеется форма и записывается текстовые файлы. Когда она запускается всё работает...

Переполнение буфера
Не могу найти, где у меня ошибка, выдает переполнение буфера, подскажите пожалуйста. Здесь...

Переполнение буфера
Подскажите, пожалуйста кто-нибудь, в чем беда... Во время выполения программы пишет, что буфер...

26
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
23.03.2015, 18:51 2
Нужно, чтобы буфер был переполнен настолько, что перезаписал то
место в стеке, где хранится адрес возврата из функции.
Эту ситуацию очень непросто воссоздать, учитывая, что между
буфером и стеком обычно масса других страниц памяти, они могут
быть недоступны даже на чтение. А еще есть всякие ASLR, затрудняющие
"предсказания" того, в каком месте располагается стек потока.
В общем, в 99% случаев результатом переполнения буфера
будет access violation и аварийное завершение программы.
1
0 / 0 / 0
Регистрация: 24.10.2013
Сообщений: 89
23.03.2015, 19:21  [ТС] 3
у меня и просходит аварийное завершение, я просто думал может в исходниках какого нибуть kernel32.dll или самого exe найти его
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
23.03.2015, 21:36 4
Можно и самому найти. Регистр RSP/ESP указывает на верхушку стека,
там лежит адрес возврата. "RSP/ESP - (buffer + size)" - это на сколько байт
нужно перезаписать буфер, чтобы добраться до позиции RSP/ESP.
На современных Windows это практически всегда дохлый номер, если
только речь не идет о каком-то заранее известном приложении, когда
вы знаете, что буфер и стек всегда на известном удалении друг от друга.
1
0 / 0 / 0
Регистрация: 24.10.2013
Сообщений: 89
24.03.2015, 15:07  [ТС] 5
А как такое можно объяснить?)

Переполнение буфера, адрес возврата


Если добавить еще один А то будет аварийное завершение...
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
24.03.2015, 15:28 6
А что удивляет ?
Буфер лежит в стеке. Где-то рядом, тоже в стеке, лежит
адрес возврата и другие данные. Они затираются.
См. выше:
Цитата Сообщение от Убежденный Посмотреть сообщение
если
только речь не идет о каком-то заранее известном приложении, когда
вы знаете, что буфер и стек всегда на известном удалении друг от друга.
Такое да, можно эксплуатировать. В других случаях под большим вопросом.
1
0 / 0 / 0
Регистрация: 24.10.2013
Сообщений: 89
24.03.2015, 15:55  [ТС] 7
так, то есть если я правильно понял это то самое количество А, когда можно добавлять адрес возврата,

Переполнение буфера, адрес возврата


это адрес по которому находится sub esp 44h? то есть strcpy(str,"\x33\x18\x41\x00");?
просто у меня задача эксплуатировать это прериполнение по средствам эксплоита
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
24.03.2015, 16:36 8
Лучший ответ Сообщение было отмечено rjrf как решение

Решение

Вы не туда смотрите. Адрес, по которому лежит инструкция "sub esp, 44h",
лежит в read-only памяти (read+execute, если быть точным), ее вы никак
не перезапишете переполнением буфера, потому что будет AV.
Вам нужно поставить точку останова на входе в show_array и посмотреть,
по какому адресу в стеке лежит буфер и где в стеке лежит адрес возврата.
И уже исходя из этого писать эксплойт.
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
24.03.2015, 16:48 9
Цитата Сообщение от Убежденный Посмотреть сообщение
Вы не туда смотрите. Адрес, по которому лежит инструкция "sub esp, 44h",
лежит в read-only памяти
я так понял что ему нужно так переполнить стек, чтобы отправить выполнение по своей ветке
дорогой rjrf, это уже взлом, а взлом здесь запрещен
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
24.03.2015, 17:12 10
И какой же это взлом ?
Ну у меня так один драйвер работает: находит адрес возврата в стеке и
подменяет его на свою функцию. Не вижу здесь никакого криминала.
И вообще, опасны не тех. средства, а мотивация...

А знать, как устроено переполнение буфера и его эксплуатация, полезно.
В первую очередь затем, чтобы писать устойчивый к таким атакам софт.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
24.03.2015, 17:20 11
Цитата Сообщение от Убежденный Посмотреть сообщение
И какой же это взлом ?
классический, "атака через переполнения буфера"
Цитата Сообщение от Убежденный Посмотреть сообщение
А знать, как устроено переполнение буфера и его эксплуатация, полезно.
так это не ко мне а к правилам
Цитата Сообщение от Убежденный Посмотреть сообщение
находит адрес возврата в стеке и
подменяет его на свою функцию. Не вижу здесь никакого криминала.
во первых находит а не втупую забивает буфер своим адресом
во вторых как посмотреть, если программа делает что то без ведома пользователя это вирусная технология
на западе против защит которые используют вирусную технологию. выигрывали суды
0
0 / 0 / 0
Регистрация: 24.10.2013
Сообщений: 89
29.03.2015, 03:58  [ТС] 12
Нашел, оказалось вот в чем была проблема:почему то открыв kernel32.dll через ida я там не смог найти call esp, а открыв его через ollydbg(посмотрев связанные с этим exe длл) смог, типо потому что диначисекая библиотека?

Добавлено через 1 минуту
Еще при написании ехплоита пытался в kernel32 найти адрес winexec с помощью ida, нашел, но он почему то не подошел, пришлоь програмно искать

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
классический, "атака через переполнения буфера"

так это не ко мне а к правилам
во первых находит а не втупую забивает буфер своим адресом
во вторых как посмотреть, если программа делает что то без ведома пользователя это вирусная технология
на западе против защит которые используют вирусную технологию. выигрывали суды
Думаю вы приувиличиваете, это у нас лаба такая на 3 курсе=)
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
29.03.2015, 11:56 13
Почитайте книгу Эриксона "Хакинг - искусство эксплойта.". В ней всё подробно расписано. Правда там всё заточено под Ubuntu, но я когда читал сидел на винде. Будет разница в адресах, в стратегиях распределения памяти операционной системой, в устройстве стека и кучи и т.д. На первых порах это мешает, но зато думаешь самостоятельно и быстро привыкаешь.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
29.03.2015, 11:57 14
Цитата Сообщение от rjrf Посмотреть сообщение
открыв kernel32.dll через ida я там не смог найти call esp
call esp - бессмысленная инструкция.
Стек лежит в неисполняемой области памяти, прыжок туда
моментально приводит к access violation.
0
0 / 0 / 0
Регистрация: 24.10.2013
Сообщений: 89
29.03.2015, 12:00  [ТС] 15
Ну не знаю) я в общеи в ntldll нашел jmp esp, вот с ним все норм, затираем main а дльше jmp esp и шел код, все работает
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
29.03.2015, 12:04 16
Цитата Сообщение от rjrf Посмотреть сообщение
в общеи в ntldll нашел jmp esp
Где ? В какой функции (и версию ntdll, пожалуйста) ?
0
0 / 0 / 0
Регистрация: 24.10.2013
Сообщений: 89
29.03.2015, 12:21  [ТС] 17
Цитата Сообщение от Убежденный Посмотреть сообщение
Где ? В какой функции (и версию ntdll, пожалуйста) ?
Еще, после исполнения шел кода происходит аварийное завершение программы, еще приходтся переодически менять адрес jmp esp и адреса в shellcode и кстати у друга не получается так сделать типо нет доступа при вызове.
версия 6.3.9600. 17031
нашел поиском команды jmp esp
С ollydbg недавно познакомился и не знаю как функцию посмотреть
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
29.03.2015, 12:29 18
Я вам продемонстрирую сейчас всю бессмысленность затеи с jmp esp:
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
#include <stdio.h>
#include <Windows.h>
 
int main()
{
    //
    // Assembly code to generate:
    //
    //      label:
    //          jmp label
    //
    byte const Opcode[] = { 0xE9, 0xFB, 0xFF, 0xFF, 0xFF };
 
    DWORD Stack;
    __asm
    {
        mov dword ptr [Stack], esp
    }
    printf("Stack pointer (ESP) = %p\n", Stack);
    memcpy((void *)Stack, Opcode, sizeof (Opcode));
    __asm
    {
        jmp dword ptr [Stack]
    }
    return 0;
}
Переполнение буфера, адрес возврата


Что такое 0xC0000005, думаю, объяснять не надо ?
1
0 / 0 / 0
Регистрация: 24.10.2013
Сообщений: 89
29.03.2015, 13:00  [ТС] 19
Цитата Сообщение от Убежденный Посмотреть сообщение
Я вам продемонстрирую сейчас всю бессмысленность затеи с jmp esp:
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
#include <stdio.h>
#include <Windows.h>
 
int main()
{
    //
    // Assembly code to generate:
    //
    //      label:
    //          jmp label
    //
    byte const Opcode[] = { 0xE9, 0xFB, 0xFF, 0xFF, 0xFF };
 
    DWORD Stack;
    __asm
    {
        mov dword ptr [Stack], esp
    }
    printf("Stack pointer (ESP) = %p\n", Stack);
    memcpy((void *)Stack, Opcode, sizeof (Opcode));
    __asm
    {
        jmp dword ptr [Stack]
    }
    return 0;
}
Вложение 507273

Что такое 0xC0000005, думаю, объяснять не надо ?
Да, при отладке после шел кода как раз таки эта ошибка вылезает... спрпить с вами не могу, но могу предположить что это как то связано с тем что vs юзает ntldll

Добавлено через 16 минут
Цитата Сообщение от Убежденный Посмотреть сообщение
Я вам продемонстрирую сейчас всю бессмысленность затеи с jmp esp:
https://vk.com/im?act=browse_images&id=107465
прикрепил скрины, может понятней станет почему работает
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
29.03.2015, 13:02 20
И зачем скрины ? Лучше опишите в деталях, как ваш эксплойт/шелл-код работает
(или как должен работать).
0
29.03.2015, 13:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2015, 13:02
Помогаю со студенческими работами здесь

переполнение буфера
Что такое переполнение буфера?

Переполнение буфера
Добрый день! В общем: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int...

Переполнение буфера! (наверное)
Идет открытие порта звуковой карты, получение битов, запись битов в буфер и дальнейшие манипуляции...

Не получается сделать переполнение буфера
Всем привет! Нужно сделать переполнение буфера и подменить адрес функции на другой. Если делаю...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru