Сейчас на форуме: Rio, tyns777, zombi-vadim (+7 невидимых) |
eXeL@B —› Программирование —› Как использовать уязвимость переполнения буфера? |
Посл.ответ | Сообщение |
|
Создано: 28 ноября 2014 18:45 · Поправил: ohos · Личное сообщение · #1 Имеется исходник предыдущей версии программы и экзешник, а так же экзешник более поздней её версии без исходника (по иде код поменялся не сильно). Посмотрел на вики как выглядят ошибки переполнения буфера и уязвимости основанные на них, заметил, что в основном они идут от использования strcpy без проверок. Нашел в исходнике целевого приложении функцию Code:
Как видим тут локальная переменная char szName[256], на сколько я помню с курсов по C++ локальные переменные хранятся в стеке, следом за её объявлением идет уязвимый strcpy( szName , FuncName.c_str() ); без проверки на размер. При тесте подсовывание функции LUA_VMClass::CheckLuaFunc (в запущенном приложении средствами самого приложения) строки более чем в 256 символов привело к зависанию процесса (еще попробую проверить с IDA, точно ли в стек строка пишется), вероятнее всего из-за переполнения буфера и затирания правильного адреса возврата, т.к. при меньшем размере строки процесс не крашится. Вопрос - есть ли толковое руководство (абы каких и поиском нашел, но они либо обрывочны, либо не содержат достаточно пояснений по достижению каждой значимой стадии и её проверки) по практическому использования уязвимости переполнения буфера? По ссылке на вики выше описаны лишь варианты техник без каких-то практически работающих примеров и пояснений как проверить ту или иную технику, как скомпоновать в дальнейшем строку с полезной нагрузкой. |
|
Создано: 28 ноября 2014 19:21 · Поправил: ARCHANGEL · Личное сообщение · #2 ohos Можно продолжать. Ещё нужно помнить про аслр и stack canaries. Но это уже надо смотреть на бинарь и систему. ----- Stuck to the plan, always think that we would stand up, never ran. | Сообщение посчитали полезным: ohos |
|
Создано: 28 ноября 2014 19:33 · Личное сообщение · #3 |
|
Создано: 02 декабря 2014 11:48 · Личное сообщение · #4 Начал с https://forum.reverse4you.org/showthread.php?t=1398, но возник вопрос связанный с metasploit'ом: скачал metasploit framework http://downloads.metasploit.com/data/releases/metasploit-latest-windows-installer.exe, нашел в нем pattern_create.rb в C:\metasploit\apps\pro\msf3\tools, нужна ли активация версии community, чтобы воспользоваться этим .rb скриптом? если не нужна, то как его запустить? (полагаю, что это ruby скрипт, т.к. по записям в интернете 3 фреймворк перешел на ruby с perl) p.s. для вопросов по metasploit создать отдельную тему или в этом спрашивать нормально? |
|
Создано: 02 декабря 2014 12:28 · Личное сообщение · #5 Для изучения обычного переполнения буфера метасплоит-это явно оверкилл. Кидай лучше вопросы сюда, ибо к данному форуму метасплоит не особо имеет отношение. А как запускать скрипты руби, особенно мало отношения имеет. Не поверишь, но ruby.exe file.rb. И активация вряд ли понадобится, если надо просто поиграться с парой скриптов. | Сообщение посчитали полезным: Rainbow |
|
Создано: 02 декабря 2014 12:44 · Личное сообщение · #6 |
|
Создано: 02 декабря 2014 17:49 · Поправил: ohos · Личное сообщение · #7 заметил, что в статье https://forum.reverse4you.org/showthread.php?t=1398 при возникновении access violation EIP содержит измененное значение, а в моем случае хоть и происходит access violation, но уже при выполнении команды cmp и EIP не изменен, поэтому возникает два вопроса: 1. для успешной эксплуатации ошибки важно обязательно получить изменение EIP? 2. раз в моем случае EIP не затирается, значит ли это, что подаваемая строка может быть недостаточно длинной? (судя по исходному коду выше там размер 256, я же закидывал до 483, т.к. свыше 483 возникает уже другая ошибка не связанная с этой) Код функции из первого поста в IDA Code:
|
|
Создано: 02 декабря 2014 18:02 · Личное сообщение · #8 |
|
Создано: 02 декабря 2014 18:21 · Поправил: ohos · Личное сообщение · #9 Stack cookie подтвердить или опровергнуть пока-что не могу, т.к. размера строки похоже просто не хватает, чтобы затереть стек по самый return. На счет современности наоборот, все сходится - она как раз разрабатывалась где-то в 2003-2005 возможно кучей не очень опытных азиатов и индусов, незащищенных strcpy в ней очень много (около 200), как и ошибок со слишком длинными строками за историю её существования. Похоже падение запущенного процесса и наблюдение при этом в дебаггере ошибки обращения к адресу являющемуся символами из поданной строки это подтверждают, просто уперся в ограничение размера подаваемой строки в текущем выбранном месте, ищу пока другие места где 483 символов хватит. К тому же прога работает на 2003 сервере майкрософта. |
|
Создано: 02 декабря 2014 19:11 · Личное сообщение · #10 |
|
Создано: 02 декабря 2014 19:28 · Личное сообщение · #11 для расчета расстояния до адреса возврата нужно учесть 1) Dest = byte ptr -11Ch 2) .text:007BBEB0 push ebp 3) .text:007BBEB3 push 0FFFFFFFFh 4) .text:007BBEB5 push offset loc_88FCDD 5) .text:007BBEC0 push eax т.е. 284+4+4+4+4=300 байт --> дальше идет адрес. Так что 483 с головой перетирают. так вот 3-4-5 и есть Stack cookie которые ты перетираешь добираясь до адреса возврата и это не требует подтверждения или опровержения. ----- 127.0.0.1, sweet 127.0.0.1 |
|
Создано: 02 декабря 2014 20:37 · Личное сообщение · #12 |
|
Создано: 10 декабря 2014 10:12 · Поправил: ohos · Личное сообщение · #13 Archer пишет: Я могу подтвердить куки .text:007BBEC1 sub esp, 148h .text:007BBEC7 mov eax, dword_92E4DC .text:007BBECC xor eax, ebp .text:007BBECE mov [ebp+var_10], eax это она и есть. Стало быть, в лучшем случае похеришь плюшку, и софт аварийно завершится на её проверке, видимо, здесь .text:007BBFF2 call sub_86DDB2 Спасибо, а все эти строки представляют stack cookie или только вызов sub_86DDB2? Его псевдокод Code:
и ассемблерный Code:
dword_92E4DC содержит 0BB40E64E, заметил, что при нажатии X на названии функции sub_86DDB2 в IDA вылезет список с ~3400 мест вызовов этой функции Добавлено спустя 6 часов 27 минут Спасибо всем кто помог, но думаю забросить это дело. Даже если исходник и старый, компилятор был наверняка новый (2012 студия или около того). Бороться со всякими защитами от ошибок переполнения думаю будет весьма тяжко и далеко не факт что успешно. Отсутствие опыта напрочь убивает и желание этим париться, попробую найти другие пути решения |
eXeL@B —› Программирование —› Как использовать уязвимость переполнения буфера? |