1. Си / Говнокод #14152

    +130

    1. 1
    http://ithappens.ru/story/11670

    Запостил: TarasB, 28 Ноября 2013

    Комментарии (106) RSS

    • сообщения компилятора
      prog.c:1:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘:’ token
       http://ithappens.ru/story/11670
           ^
      пруф: http://ideone.com/rDA4w1
      Ответить
    • здесь был похожий гк на асме:
      jmp L
      jmp L
      Ответить
      • Это скорее похоже на посадочную полосу для сплоита к переполнению буфера
        Ответить
        • Имхо, хреноватая посадочная полоса: попадешь в некратный байт и прога наебнется. Лучше уж пачку nop'ов подстелить и в конце один jmp.
          Ответить
          • И на этом все? Дальше объясняйте, кэп, а то я уж заслушался.
            Ответить
            • Я что-то не так написал? Так поправьте мои ошибки, пожалуйста :)
              Ответить
              • Да нет, наоборот, интересно.
                Ответить
                • Да толку теперь от всего этого... Стек и куча уже с бородатых времен неисполняемые. А приземлиться куда-нибудь в сегмент кода не даст ASLR.
                  Ответить
                  • > не даст ASLR
                    Ну хотя... образ самой проги вроде не двигается, только либы, стек и куча, поэтому шанс еще есть :)
                    Ответить
                    • Ответить
                    • ASLR вроде не все библиотеки двигает, а только те, которые это разрешают. Короче курите return oriented programming.
                      Ответить
                      • > Короче курите return oriented programming.
                        А, да я в курсе ;)

                        > ASLR вроде не все библиотеки двигает, а только те, которые это разрешают.
                        Да на самом деле даже если все либы двигаются, как в линухе, то все равно остается шанс, о котором я и пишу выше ;) Сама прога то, в отличие от библиотек далеко не всегда может перемещаться. И если заполучить бинарник (например узнать версию, и скачать откуда-нибудь такой же), то можно поюзать ROP прямо на нем.

                        P.S. В линухе двигаются все библиотеки, т.к. они тут по определению перемещаемые. А в винде я все-таки надеюсь на то, что народ перестанет экономить на табличках релоков.
                        Ответить
                        • Кто-то опять въебал всем по минусу?

                          А почему прога не может перемещаться? Я когда с этим разбирался, понял, что hardware DEP + ASLR + 64 бита = смерть выполнению кода через переполнение буфера. Как узнать, какие библиотеки/программы перемещаемы, а какие нет?
                          Ответить
                          • показать все, что скрыто-
                            Ответить
                          • В винде традиционно у прог не было таблицы релоков. И вполне вероятно, что до внедрения aslr загрузчик вообще не умел двигать саму прогу. Проверить, насколько помню, можно по флагу в заголовке.

                            В линухе релоков нет, зато есть PIC (позиционно-независимый код). Для so'шек он обязателен, для самих прог - нет. Поэтому половина скомпилена без него, и не может перемещаться. Проверить тоже можно по флагу в заголовке.

                            Вот как-то так, если не туплю.
                            Ответить
                            • Собрал, ради интереса, прогу под линух с флагами -pie -fPIC. Тип бинарника поменялся с ET_EXEC (как у обычной проги) на ET_DYN (как у .so'шки). И карта памяти (/proc/<pid>/maps) стала полностью(*) рандомной.

                              * По статическому адресу остается только одна 4кб секция с названием [vsyscall] висящая во всех прогах по адресу 0xffffffffff600000. В ней остались 3 небольших переходника (как я понял - быстрый доступ к sys_time, sys_gettimeofday, sys_getcpu без перехода в kernel space), а все остальное заполнено 0xCC (аля брякпоинт). Маловероятно, что на основе этих 3 групп по 10 байт, разбросанных почти на килобайт друг от друга, можно замутить что-то интересное...
                              Ответить
                              • Борманд, у меня только один вопрос: что почитать? Я, конечно, бОльшую часть понял, но хотелось бы углубить знания.
                                Ответить
                                • Ну по данному вопросу книжек я не читал. Так, ради общего образования несколько статеек по DEP и ASLR и их обходу, но это давно было, сейчас уже не найду ссылки. А про такие механизмы, как vsyscall и vdso я вообще узнал только сегодня, заглянув в карту памяти процесса...

                                  Анатомия эльфов - опять же нагугленные статейки и сырцы линуха. Курил их, когда надо было разобрать бинарник на секции.

                                  Ну а в плане асма/дизасма и архитектуры я безнадежно устарел. В x86 когда-то хорошо разбирался, а вот в x86_64 - полный нуб, и восполнять этот пробел почему-то не хочется ;(
                                  Ответить
                                • Действительно почитать бы чего, только попроще и желательно на гуssком.
                                  Ответить
                            • А что-за у них sjlj и dwarf в gcc?
                              Ответить
                              • > sjlj
                                Лол, загуглил эту аббревиатуру. Оказалось, что это банальный setjump/longjump :)

                                А дворфы это дебаг инфа.
                                Ответить
                                • seh vs sjlj vs dwarf vs ещё что-то - популярный срач на тему реализации обработки исключений внутри компилятора gcc\mingw. И ещё какие-то есть реализации, но я забыл. Так вот под эти все варианты компилят библиотеки пишут различные mingw и может получится так что подключишь Qt библиотеку и вроде все работает, но как только кто-то кинет исключение то все упадет. И вот что-то они все договорится со стандартами не могут.
                                  Ответить
                                  • Где Тарас? Самое время обосрать исключения ;)

                                    А маршаллинг исключений через инородный код всегда был проблемой. И походу навсегда ей и останется.
                                    Ответить
                            • PIC всюду пихать не дорого? По моему релоки производительнее? И как в принципе этот PIC организуют?
                              Ответить
                              • > релоки производительнее
                                Ну если базовые адреса аккуратно выбраны так, что релочить не придется (а в винде так и было) - да, быстрее ;) Если же происходит релок, то мы теряем шаринг страничек с кодом между процессами. Плюс их приходится перемапывать с экзешника на свопфайл, со всеми вытекающими последствиями.

                                > как в принципе этот PIC организуют
                                Да довольно тупо. Внутримодульным jmp/call на перемещения пофиг, там и так адреса относительные. Адреса внутримодульных глобалок считаются относительно eip, а внешние функции и переменные дергаются через GOT (global offset table), в которую их адреса помещает динамический компоновщик. Адрес самого GOT тоже вычисляется относительно eip.

                                P.S. Вот годная дока по DSO в линухе (Роману тоже пригодится, раз он хотел все это раскурить): http://www.akkadia.org/drepper/dsohowto.pdf
                                Ответить
                                • >>По моему релоки производительнее?
                                  Да Вы, батенька, хам!
                                  Ответить
                                  • Да несколько страничек с релоками можно вообще не выгружать. Так что перерелоцировать каждый раз при загрузке из свапа не нужно.

                                    Да и ни чего не мешает шарить между процессами. По дефолту система старается релоцировать по одним и тем же адресам во всех процессах. Если не получилось, то не беда. Шарим все страницы образа, кроме таблицы релоков(фиксапов\факапов).
                                    Ответить
                                    • > Да несколько страничек с релоками можно вообще не выгружать.
                                      Это в линухе все релоки кучками по GOT/PLT. А в винде, таблица импорта тоже кучкой, зато релоки инструкций, лезущих к глобалкам, рассеяны по всему сегменту кода. Зато в винде доступ к глобалкам быстрее ;)

                                      > По дефолту система старается релоцировать по одним и тем же адресам во всех процессах.
                                      И тут приходит ASLR :)
                                      Ответить
                                      • Да ну! Я же сам видел в отладчике под студией чуть ли не целую секцию в дебаге с кучей "jmp абсолютный адрес;" подряд.
                                        С этого начинается каждая импортируемая функция. Всегда делают call на этот jmp, а дальше он отправляет на реальный абсолютный адрес функции. Имхо так вообще на все функции можно делать.
                                        Ответить
                                        • > Да ну! Я же сам видел в отладчике под студией чуть ли не целую секцию в дебаге с кучей "jmp абсолютный адрес;" подряд.
                                          Ну да. А я о чем ("таблица импорта тоже кучкой")? С этой табличкой все норм. Загрузчик в нее вписывает адреса нужных функций, а потом их вызывают через jmp [слот таблички] (та самая секция, о которой ты говоришь). От этого код не портится.

                                          Зато он портится от обращений к глобальным переменным. Каждое такое обращение создает релок прямо в секции с кодом.

                                          > Имхо так вообще на все функции можно делать.
                                          Зачем на все? Внутримодульные jmp/call они относительные. Им вообще насрать на релокацию. Переходники генерируются только для межмодульных вызовов.
                                          Ответить
                                • А чего в линуксе экзешники не в PIC коде? Это каждый раз приходится перемапливать страницы при переключении задач между процессами? А как же случай запуска одного экзешника или fork?
                                  Ответить
                                  • > А чего в линуксе экзешники не в PIC коде?
                                    А х.з. Инерция и привычки видимо. Гцц вполне умеет собирать такие (опция -pie). И для полноценного ASLR ее надо включать.

                                    > Это каждый раз приходится перемапливать страницы при переключении задач между процессами?
                                    WTF? Ты о чем? Адресные пространства насколько помню меняются переключением page table. А она у каждого процесса своя.
                                    Ответить
                                • Если же происходит релок, то мы теряем шаринг страничек с кодом между процессами. Плюс их приходится перемапывать с экзешника на свопфайл, со всеми вытекающими последствиями.

                                  а почему ?не пойму
                                  Ответить
                                  • > а почему ?не пойму
                                    Ну если страничка чистая, ее можно тупо читать из бинарника, а при выгрузке тупо выкидывать. Что довольно эффективно.

                                    Если же релокатор внес в нее изменения, то при выгрузке ее надо куда-то записать. В экзешник - нельзя. Вот и остается только перемапывать на своп и писать туда.
                                    Ответить
                            • разве не было? где то есть бородатая статья аж 90-х по строению PE файлов и там рассказано про релок таблицы. Правда юзается она тока у dll файлов, стоит для лулзов поменять в хедере флаг с dll на exe и либа будет тупо грузится по подходящему адресу без всяких релокаций со всеми вытекающими. А в ельфах вроде секция есть reloc с похожим строением как у виндовых файлов
                              Ответить
                              • > Правда юзается она тока у dll файлов
                                Ну вот о чем я и писал. Под прогами имелись в виду именно exe файлы. dll то само собой релоцировались.

                                > А в ельфах вроде секция есть reloc с похожим строением как у виндовых файлов
                                Есть. И даже юзается. Но в статье, которую я кидал выше, говорят о том, что в нормальных условиях компилятор такое не генерит. И все релокации в ней ссылаются на GOT и секции данных, не трогая секции с кодом.
                                Ответить
                            • > В винде традиционно у прог не было таблицы релоков.

                              Ко-ко-ко-как это не было релоков? Win32s (это такая байда, вешавшаяся на Windows 3.1 и умевшая запускать 32-битные программы) не запускала программы без релоков, потому что в Win32s не было виртуальных адресных пространств и все программы грузились в одно пространство, а значит, адреса приходилось разруливать, чтобы не было пересечений.

                              Вот в Windows'95 уже многие (но не все) программы были без релоков (так называемые fixed executable), т. к. наконец-то появились виртуальные адресные пространства. Даже у линкеров был ключ типа «пофиксить на выбранный адрес и отрезать таблицу релоков», после чего программа становилась неюзабельной в Win32s, зато размер экзешника можно было сократить на целый килобайт и время загрузки на целую микросекунду, а также облегчить жизнь вирусмейкерам, которым даже адреса считать не нужно.

                              А в Висте внезапно вспомнили о релоках и добавили рандомизацию адреса запуска, так что старые вирусы работать перестали...
                              Ответить
                  • если только вы не виндовс с правами админа...
                    Ответить
                    • А еще можно методами социальной инженерии впарить юзеру принтер canon некоторых серий. После чего юзер наматерившись на падающие при печати браузеры будет просто вынужден выключить DEP :)
                      Ответить
                      • +1
                        Недавно читал в сети, что один уебок, пытавшийся сканировать банкноты- соснул хуец: принтер отказался сканировать и обматерил его, выдав сообщение, что он "не имеет прав для сканирования изображений данного типа". Бля, какой же членодевкой нужно быть, чтобы зашить в ДРАЙВЕР ПРИНТЕРА такую гадость? Господи...
                        Ответить
                        • Эт хуйня. Вон штатная смотрелка в вин7 не может печатать картинки на черно-белый принтер. Потому что они, блеать, ЦВЕТНЫЕ. Вот эту проверку точно членодевка писала.
                          Ответить
                          • в первый раз такое слышу
                            Ответить
                            • Года два-три назад это было. Принтер HP 1018, семерочка лицензионная, со всеми обновлениями. Все проги печатали нормально, и только "просмотр фото", или чем там по дефолту открываются картинки, не показывал принтер в списке доступных, если открыть цветной скан или фотку (на черно-белых все работало).
                              Ответить
                              • у тебя же ведь был старичок 1010(12), для которого дров под 7ку даже нет

                                офтопа ради: hp давно уже шлак какой-то штампует
                                со стартовыми картриджами и чипами на число страниц
                                мерзость
                                Ответить
                                • Ну эта история не про мой домашний. 1018 стоял на работе у сотрудницы. Дрова, насколько помню, есть под вин7 на него. Черно-белые сканы у нее печатались, а цветные - куй ;)

                                  > офтопа ради: hp давно уже шлак какой-то штампует
                                  со стартовыми картриджами и чипами на число страниц
                                  мерзость
                                  Ну они даже флешку с прошивкой из принтера выкинули. И даже кнопочку повтора/отмены... Экономия на всем ;(

                                  А еще одно время шли принтера с говном вместо USB кабелей. Собственно на том злополучном HP1018 я это в первый раз и увидел. Со штатным кабелем он работал только на USB 1.1 и троллил юзера надписью "это устройство может работать быстрее".
                                  Ответить
                                  • очень доволен своей kyocera*

                                    * здесь могла бы быть ваша реклама, жадные производители говна
                                    Ответить
                                    • Еврейский самовар выдает чай под процент.
                                      Ответить
                        • Слишком умный принтер-сканер, технология "защиты" будет работать даже на копирах (ну, должно бы).
                          Скажем спасибо властелинуизобретателям колец Омрона.
                          Ответить
                          • Закатай. Если купюру повернуть или поставить косо, предупреждение уже не выдается)
                            Ответить
                            • Вообще, это уже зависит от доброго желания изготовителя принтера/копира. Но, как подсказывает здравый смысл, геометрической защите безразлично (или должно быть) положение проверяемых точек. Потому как повороты матриц не такая уж и сложная штука.
                              Ответить
                              • ХЗ, быть может. Я бы, возможно, расспросил этого принтеровладельца поподробнее, как там и что, но он не такой человек. К сожалению.
                                Ответить
                            • Кстати. Кто нибудь в курсе, что творится с драйверами от Nvidia? Обновился, так комп в последнее время жутко глючит - бывает, что и в синьку . Дело именно в драйверах, т.к. после установки старых (диск был в комплетке с видюхой) глюки исчезают.
                              Ответить
                        • Амеровские банкноты небось?
                          Ответить
                      • Юзеры поумнее выключат деп только для процесса или оставят деп для браузера. Кстати, а как выключить деп для драйвера принтера?
                        Ответить
                        • > или оставят деп для браузера
                          Так лол в том, что падает от депа же не драйвер принтера, а сам браузер :)

                          Юзеры поумнее обновят драйвер. Благо canon уже написал не падучий.
                          Ответить
                          • Ну да, оставить деп для программ, которые смотрят в сеть.

                            Мне постоянно приходится вносить исключения для старых игр. Кстати, а без админа это можно сделать?
                            Ответить
                            • > Кстати, а без админа это можно сделать?
                              Скорее всего нет. Ну по крайней мере было бы логично, что только админ может такие настройки вертеть. Попробуй ;)
                              Ответить
                              • Да влом новый акк создавать/перелогиниваться
                                Ответить
                                • Ну в винде же можно делать sudo запускать проги от имени другого пользователя.
                                  Ответить
                                  • Ну так запусти параметры деп от другого пользователя (одна из причин, по которой сидеть под непривилегированным юзеров в винде нереально)
                                    Ответить
                                    • > одна из причин, по которой сидеть под непривилегированным юзеров в винде нереально
                                      Ну на семерке все-таки пореальней. Вот на XP - там да, с этим была полная жопа. Да еще и адекватных прог было очень мало, половина срала в program files.

                                      Блин, нет винды под рукой. Панель управления запустить не получится от имени администратора (как крайний случай - найти control.exe, или как там его, и в контекстном меню "запустить от имени")?
                                      Ответить
                                      • Поставь в виртуалку и проверь. В любом случае, все будет гораздо неудобнее чем просто win+break и дальше
                                        Ответить
                                        • > В любом случае, все будет гораздо неудобнее чем просто win+break и дальше
                                          Ну что поделать. Ты же не каждый день DEP прогам отключаешь?

                                          > Поставь в виртуалку и проверь.
                                          Да лениво. Это образ семерочки искать и т.п.

                                          P.S. Кстати, где-то слышал, что если поставить совместимость с более ранними виндами в свойствах ярлычка, то DEP на эту прогу включаться не будет. Попробуй, может правда.
                                          Ответить
                                          • Старым игрушкам - почти всегда. Пришел ты на чужую систему в вузе или на работе, где у тебя нет админа, а прога падает. Что буш делать?

                                            Я про хрю в первую очередь говорил.
                                            Ответить
                                            • > Что буш делать?
                                              Не лезть на чужие системы со старыми игрушками/или звать админа и пить с ним пиво :)

                                              Попробуй все-таки совместимость с вин2к в свойствах ярлыка поставить. Если то что я писал выше не брехня - DEP для этой проги будет отключен.
                                              Ответить
                                              • А если это не игрушка?

                                                >или звать админа и пить с ним пиво
                                                Это прикол? А он тебе скажет, что вообще нехуй здесь левые проги запускать?
                                                Ответить
                                                • > А он тебе скажет, что вообще нехуй здесь левые проги запускать?
                                                  А зачем ты тогда запускаешь там левые проги? У админа работа такая, чтобы кто попало что попало не запускал. И винда с урезанным пользователем ему в этом неплохо понимает. В конце-концов отвечать за забагованный комп потом ему, а не тебе. Скажи ему спасибо, что он вообще белый список прог не включил (винда и так умеет).

                                                  P.S. Когда учился в институте - проблем не было, всегда можно было договориться. В одном машзале умудрялись в контру бегать даже при преподе, во время пар у какой-то группы экономистов ;)

                                                  Ты попробовал совместимость с вин2к? Все равно DEP убивает?
                                                  Ответить
                                                  • >А зачем ты тогда запускаешь там левые проги? У админа работа такая, чтобы кто попало что попало не запускал.
                                                    У админа работа, чтобы комп работал и юзеры друг другу не гадили, если их много на компе, а для этого прав юзера + патчи полностью достаточно.

                                                    Какой нафиг забагованый комп? Сразу видно недовиндоблядь. В винде забаговать что-то под непривилегированным юзером можно только самому себе. Ну не считая петухов, которые мало места выделяли под раздел с виндой и на нем заканчивалось место, т.к. люди на рабочем столе хранили образы DVD а они при логине синхронизировались на каждом компе, лол.

                                                    >Скажи ему спасибо, что он вообще белый список прог не включил (винда и так умеет).
                                                    Была бы необходимость, перевешивающая геморрой - может бы так и сделал. Раз не сделал - значит не перевесила.

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

                                                    У нас и так с гамесами спокойно было, если места всем хватало. Не рашка.
                                                    Ответить
                                                    • Алсо был момент, когда я копировал своё файло с флешки на внешний диск и sophos поудалял пару файлов потому что он не смог распаковать экзешник и сразу обьявил его вирусом. Вменяемых обьяснений, почему надо было настраивать антивирь на удаление вместо блокирования доступа я так и не услышал. Единственное, что я понял - свои проблемы придется решать самому, хоть пароль админа пизди и выключай авирь (Так я обычно и делал. А еще я баловался с pstools, удаленно грохая у юзеров explorer с деревом потомков).
                                                      Ответить
                                                      • А еще я удаленно грохал у юзеров explorer

                                                        4D54686400000006000000000000
                                                        в гекс-редакторе вставить в *.wmv
                                                        Грохает эксплорер на XP через переполнение буфера.
                                                        Ответить
                                                    • > В винде забаговать что-то под непривилегированным юзером можно только самому себе.
                                                      Ну если там одна паблик учетка - то себе = всем. Я именно такой случай и представлял, когда вспоминал об институте. У нас так и было, персональных не раздавали ;)
                                                      Ответить
                                                      • >Ну если там одна паблик учетка
                                                        Бггг. У нас одна учетка на рыло, на ней и логин, и почта, итд. Так что проблема не в винде, а в недоадминах.

                                                        В такой ситуации надо было гостя юзать, там настройки после логаута смывались.
                                                        Ответить
                                                        • >>
                                                          Бггг. У нас одна учетка на рыло

                                                          жжошь, сотона! Уау!
                                                          Ответить
    • Кто блять плюсует?
      Ответить

    Добавить комментарий