Оперируем WinAmp Ichwill (artem_king@rambler.ru) Хакер, номер #075, стр. 075-056-1 Выполнение произвольных команд с помощью WinAmp’а Многие люди искренне считают, что написать эксплойт к известной программе очень сложно. Они думают, что это доступно только гениям и они никогда в жизни не смогут этому научиться в силу собственной физической ограниченности. Вот что я тебе скажу: ничего подобного! Научить писать некоторые эксплойты можно даже обезьяну, для этого необходимы только опыт и знания, получить которые можно единственным путем: постоянно развиваясь и пробуя себя в чем-то новом. Сегодня я покажу, как легко и просто можно написать сплойт к приложению, которым пользуются миллионы человек. WinAmp под прицелом Сегодня мы с тобой будем изучать уже лохматую уязвимость в WinAmp’е, причем результатом этого изучения станет работоспособный эксплойт. Для тех, кто не следит за новостями, поясняю: 24 ноября в плагине WinAmp’а in_cdda.dll было обнаружено переполнение буфера. Чтобы убедиться в наличии этой уязвимости, нужно создать m3u-плейлист, в котором указан достаточно длинный путь к файлу с расширением cda. В принципе, уязвимы все версии WinAmp’а до 5.06 включительно, но наш эксплойт будет работать только в пятых версиях плеера. Это прежде всего связано с тем, что в разных версиях WinAmp’а адреса строк плейлиста сильно различаются. Еще одним ограничением для применения нашего эксплойта является то, что он будет работать только под NT-подобными системами (Windows NT, 2000, XP, 2003). Но даже с такими серьезными недочетами найти применение нашему творению будет не так уж и сложно: многие пользователи и по сей день используют уязвимые версии винампа. Волшебный playlist Для начала необходимо создать корявый m3u-файл, который должен опрокинуть WinAmp. Он будет выглядеть примерно так: #EXTM3U C:\1234567890abcdefghijklmnopqr.cda Если винамп откроет такой плейлист, то сдохнет, едва успев начать работать. Сразу скажу, что у меня стоит WinAmp 5.0, поэтому все технические детали будут справедливы в первую очередь для него. В предыдущих версиях WinAmp’а, как я уже говорил, адреса строк варьируются и могут появляться сообщения отладчика о проблемах с точкой входа в модуле gen_jumpex.dll, но это не так важно. Курс на переполнение Теперь необходимо разобраться, из-за чего все-таки WinAmp прекратил свою работу. Для этого воспользуемся отладчиком, пусть для простоты это будет OllyDbg. Запускаем его, загружаем winamp.exe, в качестве arguments указываем путь к нашему волшебному playlist’у и нажимаем F9, то есть начинаем процесс отладки. Совсем скоро Olly остановится и выдаст нам «Access Violation …». В этот момент как раз и произошло переполнение буфера, но это нас пока не интересует. Нажимаем shift+F7 и F9, Olly вновь начинает работать и вновь останавливается, но результаты на этот раз куда интереснее. Отладчик пишет «Access Violation when executing [66656463] …». Это означает, что WinAmp попытался выполнить инструкцию по адресу 66656463h. Стой, а что такое 66, 65, 64, 63? Это же коды латинских букв f, e, d, c. Я надеюсь, ты знаешь, что когда происходит переполнение буфера в стеке (а у нас как раз этот случай), то переполняющийся буфер может затереть определенные адреса, которые располагаются в этом самом стеке и на которые в дальнейшем будет передано управление. Как мы видим, байты c, d, e, f из нашего длинного имени файла затерли именно такой адрес, то есть значение этого адреса стало равно значению этих байт, и в процессе выполнения WinAmp передал управление затертому адресу. Отсюда мы можем передать управление в любую точку программы, изменяя значения байт c, d, e, f. В принципе, теперь нам нужно найти место в памяти, где располагается наше имя файла. Искать его можно в трех местах: в памяти самого WinAmp’a, в памяти in_cdda.dll и в стеке. Самое лучшее для нас - найти нашу строку с именем файла в адресном пространстве WinAmp’а. Хотя здесь возникает несколько неразрешимых проблем: адрес любой ячейки памяти, принадлежащей winamp.exe, будет содержать нулевой байт, а в нашем случае это недопустимо, и этот же адрес будет меняться в каждой версии WinAmp’а. Поэтому я предпочел найти переполняющую строку в in_cdda.dll (мучиться со стеком у меня особого желания и времени не было), надеясь, что в разных условиях местоположение шелл-кода не будет особо изменяться. Найти этот адрес мы вполне сможем с помощью того же самого Olly: выбирай View –> Memory, находи там память, принадлежащую in_cdda.dll (Owner: in_cdda.dll), и щелкай по сегменту data. Появится новое окошко, в котором, внимательно присмотревшись, ты найдешь нашу строку. У меня адрес строки равен 10023528h, у тебя он, конечно же, может быть другим. Для уверенности расположим дорожку из NOP’ов в начале будущего шелл-кода. Кстати, сейчас речь пойдет как раз о нем. |