21 Декабря, 2006

DOS в функции MessageBox

Shred
Оригинальный текст и ссылка на исходник тут

Скампилив исходник на С#, наблюдаем переполнение функции Messagebox и после выдачи нескольких сообщений, машина послушно идёт в ребут(WinXP SP2). Но как же? Язык C# гарантирует выполнение приложения в своём собственном адресном пространстве и просто не может привести к такому краху. Но всё не так, как кажется.



  • 1) Используется флаг unsafe, что уже снимает все обязанности с Framework, т.к. используя этот флаг, приложение получает доступ к адресному пространству других приложений.

  • 2) На самом деле вызывается сишная функция
    [DllImport("user32.dll")]
    unsafe public static extern int MessageBoxA(uint hwnd, byte* lpText, byte* lpCaption, uint uType);

    и не используется безопасная C# функция.


Какой можно сделать вывод? Да приложение написано на C#, но импортируется уязвимая функция из С++. Дело закрыто, C# оправдан! :)

Кому лень кампилить тут лежит исходник и ехе'ха. Запускать советую в VMWare.
или введите имя

CAPTCHA
1
21 Декабря, 2006
RE: DOS в функции MessageBox
падает csrss.exe, и именно он выводит сообщения, если указывать MB_SERVICE_NOTIFICATION
0 |
21 Декабря, 2006
RE: RE: DOS в функции MessageBox
Ну процесс csrss.exe думаю тут не причём и не только он может выставлять флаг MB_SERVICE_NOTIFICATION для MessageBoxа. Я хотел сконцентрировать внимание на том, что бажную сишную функцию кто-то представил в шарповском приложении. В результате у кого-нить могло сложиться впечатление, что это баг шарповой функции. ИМХО всё это слёгкость можно было представить в обычнос С++ приложении. Для чего так сделали - непонятно.
0 |
22 Декабря, 2006
RE: DOS в функции MessageBox
это просто переписанный на шарпе вариант. Он же на С++: http://www.securitylab.ru/blog/live_and_learn/473.php
0 |
22 Декабря, 2006
RE: RE: DOS в функции MessageBox
Дак вот как раз мне странным и показалось, зачем показывать уязвимость сишной функции импортируя её в шарповый проект? Давайте теперь все найденные баги винды реализовывать под линух! Будет тот же изврат
0 |
1
28 Декабря, 2006
RE: RE: RE: DOS в функции MessageBox
Баян [:]|||[:] fantom@northwestnet.ru
0 |
28 Декабря, 2006
RE: RE: RE: RE: DOS в функции MessageBox
В смысле боян? Пост был создан в тот же день, когда исходник был опубликован на секлабе и спустя 6 дней как автор - NULL в 15.12.2006 - 12:05 запостил свою заходку, вот тут http://www.kuban.ru/forum_new/forum2/files/19124.html. Так, что врятли боян!
0 |
9 Января, 2007
RE: DOS в функции MessageBox
А вот ещё более интересная информация. И совсем не MessageBox виноват товарищи. Бага во внутренней функции GetHardErrorText, которая вызывается при генерации исключения HardError (NtRaiseHardError), просто MB_SERVICE_NOTIFICATION эмулируется через это самое исключение. А вот и бажный код:             if (strstr(asLocal.Buffer,"\\Device") == asLocal.Buffer) {                 SubstituteDeviceName(&usLocal,asLocal.Buffer);             } else if ((asLocal.Length > 4) && !_strnicmp(asLocal.Buffer, "\\??\\", 4)) {                 strcpy( asLocal.Buffer, asLocal.Buffer+4 );                 asLocal.Length -= 4;             } else { ... Обратите внимание на !_strnicmp(asLocal.Buffer, "\\??\\", 4) - узнаёте магичскую комбинацию "\\??\\" . И особенно на то код внутри if-а, при выполнении этого условия: strcpy( asLocal.Buffer, asLocal.Buffer+4 ). Использование одного и того же буфера в качестве источника и приёмника у strcpy приводит к банальному UB, который в данном случае означает BSOD )). К сожалению нарыл не я, но подобный код там есть - факт, сам проверил . А вот ссылка на первоисточник на баг-траке - здесь
0 |
9 Января, 2007
RE: RE: DOS в функции MessageBox
Интересно где чувак взял сорцы винды? Может он 2к ковырял, помниться года 3 назад стырили у микрософка исходники 2к, када-то сам в них копашился. Из поста на баг траке сразу понятно, чо нифига не понятно в чём собсна прикол. Чувак говорит от функции, которая анализирует текст в месадж боксе. Я так понял, как только в месадж боксе появляется исключение (к примеру как раз наш случай), функция GetHardErrorText её просто регистрирует. Как она может быть причиной баги я так и не понял.
0 |
10 Января, 2007
RE: RE: RE: DOS в функции MessageBox
Интересно где чувак взял сорцы винды? Может он 2к ковырял, помниться года 3 назад стырили у микрософка исходники 2к...Именно о них и речь. Я по ним же проверял. Только это не самой 2к, а не-то 1-ого, не-то 2-ого сервис пака. Из поста на баг траке сразу понятно, чо нифига не понятно в чём собсна прикол. Чувак говорит от функции, которая анализирует текст в месадж боксе.Не совсем так. Похоже чувак не полностью разобрался с этой функцией. GetHardErrorText вызывается при обработке HardError для формирования заголовка, текста и прочих сообщений, которые потом будут зарегистрированы в EventLog`е или выведены в MessageBox`е (в общем случае и то и другое). А MB_SERVICE_NOTIFICATION в дебрях системы вроде как эмулируется как раз через HardError, чуть ли не генерирует его, чтобы вывести MessageBox на текущий активный рабочий стол и зарегистрировать его в EventLog`е.
0 |
1
10 Января, 2007
RE: RE: RE: RE: DOS в функции MessageBox
Ок, ты говоришь, что HardError эмулирует MB_SERVICE_NOTIFICATION, который помещается в MessageBox и при определённых значениях для вот этих вот параметров byte* lpText, byte* lpCaption в функции MessageBox как раз и будет происходить исключение. Можешь подсказать, что собой вообще явлет HardError? Потому что чувак с багтрака Killer{R} говорит, что "MB_SERVICE_NOTIFICATION месагбокс с эмулируется через NtRaiseHardError ) " , неоднозначность какая-то, кому верить? Или ты имел ввиду NtRaiseHardError=HardError, так сказать сократил? . Вообще посмотрев пост, думаю можно предположить, что если else if выполниться, то вот это strcpy( asLocal.Buffer, asLocal.Buffer+4 ) может привести к переполнению. Тут идёт попытка большее asLocal.Buffer+4 писать в меньшее asLocal.Buffer. Если выделенная память под asLocal.Buffer уже полность забита и функция strcpy попытается записать туда ещё +4, то есть вероятность, что данные вылезут с сегмента стека и перезапишут область кода. Непонятно зачем вообще нужно было юзать эту бажную функцию, если уже достаточно давно была написана более безопасная функция strncpy вроде её клтчут.
0 |
1
10 Января, 2007
RE: RE: RE: RE: RE: DOS в функции MessageBox
Mr. None щас перечитал твой первый пост, ты и сам говорил про strcpy. Причём тут HardError и откуда она ваще взялась?
0 |
1
10 Января, 2007
RE: RE: RE: RE: RE: RE: DOS в функции MessageBox
Гы, начинаю просыпаться - это следвтвие следствия . Как только происходит исключение HardError вызывается бажная ф-я GetHardErrorText, в которой стркопи и начинает свои весёлые дела, я пральна понял?
0 |
11 Января, 2007
RE: RE: RE: RE: RE: RE: RE: DOS в функции MessageBox
Именно! А MessageBox с MB_SERVICE_NOTIFICATION вроде как раз и швыряет HardError, чтобы прорваться из WinSTA сервиса к активной WinSTA .
0 |
1
11 Января, 2007
RE: RE: RE: RE: RE: RE: RE: RE: DOS в функции MessageBox
WinSTA ? ты winsta.dll имеешь ввиду? А каким макаром она причастна?
0 |
12 Января, 2007
RE: RE: RE: RE: RE: RE: RE: RE: RE: DOS в функции MessageBox
Опять сокрщение WinSTA - Windows Station. Дефолтная Windows Station называется WinSta0, поэтому иногда так сокращают. Каждому интерактивному сервису создаётся своя выделенная Windows Station, поэтому любой message box будет отображён в ней и пользователь ничего не увидит. Есть предположение, что для того чтобы отобразить message box MB_SERVICE_NOTIFICATION именно на десктопе активного пользователя (прорваться в его Windows Station так сказать) и выбрасывается исключение.
0 |
12 Января, 2007
RE: RE: RE: RE: RE: RE: RE: RE: RE: RE: DOS в функции MessageBox
К сожалению опыта работы с сессиями, window station-ами и ихними десктопами у меня нет, но я так понял, наверна для реализации сплоита ты предлагаешь "(прорваться в его Windows Station так сказать) и выбрасывается исключение. ". Погуглив нашёл, что для того чтобы создать процесс, который будет асосиирован с 2мя сессиями и соответственно будет именть доступ к памяти в обеих сессий для вызова нужного нам исключения, нужно юзать КреатФайлМапинг. Но опятьже, там очень много подводных камней и в практической реализации спецы обещают появление большое колличества траблов. На секлабе уже выложили готовый сплоит. Его автор, как я понял вроде пошёл другим путём.
0 |
12 Января, 2007
RE: RE: RE: RE: RE: RE: RE: RE: RE: RE: RE: DOS в функции MessageBox
Вернее для создания процесса нужно юзать КреатФайлМапинг (что видно из самого названия в принципе), а то можно подумать, что для вызова именно самого исключения . Мысль ушла далеко и исмысл предложения слегка поменялся
0 |
psiholuas
16 Декабря, 2013
http://relaks.org.ua
Сайт путешествия, релакс, отдых, психология, аюрведа, йога, релакс тур
0 |
kuzgradloa
30 Декабря, 2013
http://kuzgrad.ru
смотрите - заходите и Вы не пожалеете!
0 |
rusukrmic
11 Января, 2014
http://rusukrforum.com
Приветствую! Нашел новость в интернете про Украину украина без россии ничто подсказать похожие сайты ?
0 |
zakgazelGex
23 Февраля, 2014
http://vk.com/zakazatgazel
заказать газель
0 |