- 1
http://ithappens.ru/story/11670
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+130
http://ithappens.ru/story/11670
defecate-plusplus 28.11.2013 14:35 # +13
TarasB 28.11.2013 14:36 # +3
guest 29.11.2013 15:56 # −1
Надо тебе хорошенького хуястенького кавказца подыскать, чтоб он тебя взбодрил.
guest 01.12.2013 02:15 # −15
anonimb84a2f6fd141 29.11.2013 19:25 # −4
guest 30.11.2013 13:12 # +2
defecate-plusplus 30.11.2013 14:41 # +9
Stertor 30.11.2013 19:48 # 0
defecate-plusplus 01.12.2013 00:36 # +8
LispGovno 01.12.2013 03:10 # +2
Lure Of Chaos 02.12.2013 03:01 # 0
defecate-plusplus 02.12.2013 09:18 # +1
Lure Of Chaos 02.12.2013 10:58 # +1
defecate-plusplus 02.12.2013 11:04 # +3
dwarf_with_beer 29.11.2013 07:52 # +2
jmp L
jmp L
anonimb84a2f6fd141 29.11.2013 19:26 # −2
bormand 29.11.2013 19:51 # +6
guest 30.11.2013 11:32 # +3
bormand 30.11.2013 11:52 # +4
guest 30.11.2013 13:11 # +3
bormand 30.11.2013 13:34 # +4
bormand 30.11.2013 13:42 # +2
Ну хотя... образ самой проги вроде не двигается, только либы, стек и куча, поэтому шанс еще есть :)
bormand 30.11.2013 13:49 # +2
anonimb84a2f6fd141 30.11.2013 15:28 # −1
bormand 30.11.2013 16:15 # +2
А, да я в курсе ;)
> ASLR вроде не все библиотеки двигает, а только те, которые это разрешают.
Да на самом деле даже если все либы двигаются, как в линухе, то все равно остается шанс, о котором я и пишу выше ;) Сама прога то, в отличие от библиотек далеко не всегда может перемещаться. И если заполучить бинарник (например узнать версию, и скачать откуда-нибудь такой же), то можно поюзать ROP прямо на нем.
P.S. В линухе двигаются все библиотеки, т.к. они тут по определению перемещаемые. А в винде я все-таки надеюсь на то, что народ перестанет экономить на табличках релоков.
anonimb84a2f6fd141 01.12.2013 00:55 # 0
А почему прога не может перемещаться? Я когда с этим разбирался, понял, что hardware DEP + ASLR + 64 бита = смерть выполнению кода через переполнение буфера. Как узнать, какие библиотеки/программы перемещаемы, а какие нет?
guest 01.12.2013 02:14 # −11
anonimb84a2f6fd141 01.12.2013 04:37 # −1
TarasB 01.12.2013 13:31 # +5
anonimb84a2f6fd141 01.12.2013 15:35 # −10
Stertor 01.12.2013 15:46 # +1
bormand 01.12.2013 09:45 # +3
В линухе релоков нет, зато есть PIC (позиционно-независимый код). Для so'шек он обязателен, для самих прог - нет. Поэтому половина скомпилена без него, и не может перемещаться. Проверить тоже можно по флагу в заголовке.
Вот как-то так, если не туплю.
bormand 01.12.2013 11:31 # +3
* По статическому адресу остается только одна 4кб секция с названием [vsyscall] висящая во всех прогах по адресу 0xffffffffff600000. В ней остались 3 небольших переходника (как я понял - быстрый доступ к sys_time, sys_gettimeofday, sys_getcpu без перехода в kernel space), а все остальное заполнено 0xCC (аля брякпоинт). Маловероятно, что на основе этих 3 групп по 10 байт, разбросанных почти на килобайт друг от друга, можно замутить что-то интересное...
roman-kashitsyn 01.12.2013 12:38 # +4
bormand 01.12.2013 13:51 # +4
Анатомия эльфов - опять же нагугленные статейки и сырцы линуха. Курил их, когда надо было разобрать бинарник на секции.
Ну а в плане асма/дизасма и архитектуры я безнадежно устарел. В x86 когда-то хорошо разбирался, а вот в x86_64 - полный нуб, и восполнять этот пробел почему-то не хочется ;(
anonimb84a2f6fd141 01.12.2013 15:37 # 0
anonimb84a2f6fd141 01.12.2013 21:18 # −1
anonimb84a2f6fd141 01.12.2013 22:47 # −4
LispGovno 01.12.2013 14:15 # +3
bormand 01.12.2013 14:38 # +5
Лол, загуглил эту аббревиатуру. Оказалось, что это банальный setjump/longjump :)
А дворфы это дебаг инфа.
LispGovno 01.12.2013 15:16 # +4
bormand 01.12.2013 15:30 # +4
А маршаллинг исключений через инородный код всегда был проблемой. И походу навсегда ей и останется.
LispGovno 01.12.2013 14:16 # +2
bormand 01.12.2013 15:13 # +5
Ну если базовые адреса аккуратно выбраны так, что релочить не придется (а в винде так и было) - да, быстрее ;) Если же происходит релок, то мы теряем шаринг страничек с кодом между процессами. Плюс их приходится перемапывать с экзешника на свопфайл, со всеми вытекающими последствиями.
> как в принципе этот PIC организуют
Да довольно тупо. Внутримодульным jmp/call на перемещения пофиг, там и так адреса относительные. Адреса внутримодульных глобалок считаются относительно eip, а внешние функции и переменные дергаются через GOT (global offset table), в которую их адреса помещает динамический компоновщик. Адрес самого GOT тоже вычисляется относительно eip.
P.S. Вот годная дока по DSO в линухе (Роману тоже пригодится, раз он хотел все это раскурить): http://www.akkadia.org/drepper/dsohowto.pdf
Stertor 01.12.2013 15:43 # −1
Да Вы, батенька, хам!
LispGovno 01.12.2013 18:05 # +2
Да и ни чего не мешает шарить между процессами. По дефолту система старается релоцировать по одним и тем же адресам во всех процессах. Если не получилось, то не беда. Шарим все страницы образа, кроме таблицы релоков(фиксапов\факапов).
bormand 01.12.2013 21:38 # +3
Это в линухе все релоки кучками по GOT/PLT. А в винде, таблица импорта тоже кучкой, зато релоки инструкций, лезущих к глобалкам, рассеяны по всему сегменту кода. Зато в винде доступ к глобалкам быстрее ;)
> По дефолту система старается релоцировать по одним и тем же адресам во всех процессах.
И тут приходит ASLR :)
LispGovno 01.12.2013 21:55 # 0
С этого начинается каждая импортируемая функция. Всегда делают call на этот jmp, а дальше он отправляет на реальный абсолютный адрес функции. Имхо так вообще на все функции можно делать.
bormand 01.12.2013 22:15 # +2
Ну да. А я о чем ("таблица импорта тоже кучкой")? С этой табличкой все норм. Загрузчик в нее вписывает адреса нужных функций, а потом их вызывают через jmp [слот таблички] (та самая секция, о которой ты говоришь). От этого код не портится.
Зато он портится от обращений к глобальным переменным. Каждое такое обращение создает релок прямо в секции с кодом.
> Имхо так вообще на все функции можно делать.
Зачем на все? Внутримодульные jmp/call они относительные. Им вообще насрать на релокацию. Переходники генерируются только для межмодульных вызовов.
LispGovno 01.12.2013 18:10 # +2
bormand 01.12.2013 21:40 # +3
А х.з. Инерция и привычки видимо. Гцц вполне умеет собирать такие (опция -pie). И для полноценного ASLR ее надо включать.
> Это каждый раз приходится перемапливать страницы при переключении задач между процессами?
WTF? Ты о чем? Адресные пространства насколько помню меняются переключением page table. А она у каждого процесса своя.
LispGovno 01.12.2013 21:49 # 0
dwarf_with_beer 02.12.2013 16:02 # 0
а почему ?не пойму
bormand 02.12.2013 19:04 # 0
Ну если страничка чистая, ее можно тупо читать из бинарника, а при выгрузке тупо выкидывать. Что довольно эффективно.
Если же релокатор внес в нее изменения, то при выгрузке ее надо куда-то записать. В экзешник - нельзя. Вот и остается только перемапывать на своп и писать туда.
dwarf_with_beer 02.12.2013 19:35 # 0
dwarf_with_beer 02.12.2013 15:57 # 0
bormand 02.12.2013 19:11 # 0
Ну вот о чем я и писал. Под прогами имелись в виду именно exe файлы. dll то само собой релоцировались.
> А в ельфах вроде секция есть reloc с похожим строением как у виндовых файлов
Есть. И даже юзается. Но в статье, которую я кидал выше, говорят о том, что в нормальных условиях компилятор такое не генерит. И все релокации в ней ссылаются на GOT и секции данных, не трогая секции с кодом.
inkanus-gray 08.12.2013 10:04 # +3
Ко-ко-ко-как это не было релоков? Win32s (это такая байда, вешавшаяся на Windows 3.1 и умевшая запускать 32-битные программы) не запускала программы без релоков, потому что в Win32s не было виртуальных адресных пространств и все программы грузились в одно пространство, а значит, адреса приходилось разруливать, чтобы не было пересечений.
Вот в Windows'95 уже многие (но не все) программы были без релоков (так называемые fixed executable), т. к. наконец-то появились виртуальные адресные пространства. Даже у линкеров был ключ типа «пофиксить на выбранный адрес и отрезать таблицу релоков», после чего программа становилась неюзабельной в Win32s, зато размер экзешника можно было сократить на целый килобайт и время загрузки на целую микросекунду, а также облегчить жизнь вирусмейкерам, которым даже адреса считать не нужно.
А в Висте внезапно вспомнили о релоках и добавили рандомизацию адреса запуска, так что старые вирусы работать перестали...
dwarf_with_beer 02.12.2013 15:51 # 0
bormand 02.12.2013 19:16 # +3
Stertor 02.12.2013 19:23 # 0
Недавно читал в сети, что один уебок, пытавшийся сканировать банкноты- соснул хуец: принтер отказался сканировать и обматерил его, выдав сообщение, что он "не имеет прав для сканирования изображений данного типа". Бля, какой же членодевкой нужно быть, чтобы зашить в ДРАЙВЕР ПРИНТЕРА такую гадость? Господи...
bormand 02.12.2013 19:48 # 0
defecate-plusplus 02.12.2013 19:56 # 0
bormand 02.12.2013 20:48 # 0
defecate-plusplus 02.12.2013 20:51 # +1
офтопа ради: hp давно уже шлак какой-то штампует
со стартовыми картриджами и чипами на число страниц
мерзость
bormand 02.12.2013 21:06 # 0
> офтопа ради: hp давно уже шлак какой-то штампует
со стартовыми картриджами и чипами на число страниц
мерзость
Ну они даже флешку с прошивкой из принтера выкинули. И даже кнопочку повтора/отмены... Экономия на всем ;(
А еще одно время шли принтера с говном вместо USB кабелей. Собственно на том злополучном HP1018 я это в первый раз и увидел. Со штатным кабелем он работал только на USB 1.1 и троллил юзера надписью "это устройство может работать быстрее".
defecate-plusplus 02.12.2013 22:48 # +3
* здесь могла бы быть ваша реклама, жадные производители говна
Stertor 02.12.2013 23:31 # −1
eth0 02.12.2013 20:06 # 0
Скажем спасибо властелинуизобретателям колец Омрона.
Stertor 02.12.2013 20:07 # −2
eth0 02.12.2013 20:16 # 0
Stertor 02.12.2013 20:18 # −2
Stertor 02.12.2013 20:16 # −2
anonimb84a2f6fd141 03.12.2013 01:59 # −1
anonimb84a2f6fd141 03.12.2013 01:59 # −1
bormand 03.12.2013 05:29 # +1
Так лол в том, что падает от депа же не драйвер принтера, а сам браузер :)
Юзеры поумнее обновят драйвер. Благо canon уже написал не падучий.
anonimb84a2f6fd141 03.12.2013 17:38 # −1
Мне постоянно приходится вносить исключения для старых игр. Кстати, а без админа это можно сделать?
bormand 03.12.2013 18:24 # 0
Скорее всего нет. Ну по крайней мере было бы логично, что только админ может такие настройки вертеть. Попробуй ;)
anonimb84a2f6fd141 03.12.2013 20:21 # −1
bormand 03.12.2013 20:49 # 0
anonimb84a2f6fd141 03.12.2013 20:51 # −1
bormand 03.12.2013 21:00 # 0
Ну на семерке все-таки пореальней. Вот на XP - там да, с этим была полная жопа. Да еще и адекватных прог было очень мало, половина срала в program files.
Блин, нет винды под рукой. Панель управления запустить не получится от имени администратора (как крайний случай - найти control.exe, или как там его, и в контекстном меню "запустить от имени")?
anonimb84a2f6fd141 03.12.2013 21:20 # −1
bormand 03.12.2013 21:25 # 0
Ну что поделать. Ты же не каждый день DEP прогам отключаешь?
> Поставь в виртуалку и проверь.
Да лениво. Это образ семерочки искать и т.п.
P.S. Кстати, где-то слышал, что если поставить совместимость с более ранними виндами в свойствах ярлычка, то DEP на эту прогу включаться не будет. Попробуй, может правда.
anonimb84a2f6fd141 03.12.2013 21:47 # −1
Я про хрю в первую очередь говорил.
bormand 03.12.2013 21:59 # 0
Не лезть на чужие системы со старыми игрушками/или звать админа и пить с ним пиво :)
Попробуй все-таки совместимость с вин2к в свойствах ярлыка поставить. Если то что я писал выше не брехня - DEP для этой проги будет отключен.
anonimb84a2f6fd141 03.12.2013 22:04 # −1
>или звать админа и пить с ним пиво
Это прикол? А он тебе скажет, что вообще нехуй здесь левые проги запускать?
bormand 03.12.2013 22:18 # +1
А зачем ты тогда запускаешь там левые проги? У админа работа такая, чтобы кто попало что попало не запускал. И винда с урезанным пользователем ему в этом неплохо понимает. В конце-концов отвечать за забагованный комп потом ему, а не тебе. Скажи ему спасибо, что он вообще белый список прог не включил (винда и так умеет).
P.S. Когда учился в институте - проблем не было, всегда можно было договориться. В одном машзале умудрялись в контру бегать даже при преподе, во время пар у какой-то группы экономистов ;)
Ты попробовал совместимость с вин2к? Все равно DEP убивает?
anonimb84a2f6fd141 03.12.2013 22:33 # −1
У админа работа, чтобы комп работал и юзеры друг другу не гадили, если их много на компе, а для этого прав юзера + патчи полностью достаточно.
Какой нафиг забагованый комп? Сразу видно недовиндоблядь. В винде забаговать что-то под непривилегированным юзером можно только самому себе. Ну не считая петухов, которые мало места выделяли под раздел с виндой и на нем заканчивалось место, т.к. люди на рабочем столе хранили образы DVD а они при логине синхронизировались на каждом компе, лол.
>Скажи ему спасибо, что он вообще белый список прог не включил (винда и так умеет).
Была бы необходимость, перевешивающая геморрой - может бы так и сделал. Раз не сделал - значит не перевесила.
У вас там по-другому значит. У нас один образ заливается на все компы что есть. Бывали кабинеты, где винду настраивал хуй знает кто, там даже флеша не было. Вот там точно ни до кого не достучишься.
У нас и так с гамесами спокойно было, если места всем хватало. Не рашка.
anonimb84a2f6fd141 03.12.2013 22:39 # −1
Stertor 03.12.2013 22:48 # −1
в гекс-редакторе вставить в *.wmv
Грохает эксплорер на XP через переполнение буфера.
bormand 03.12.2013 22:46 # +1
Ну если там одна паблик учетка - то себе = всем. Я именно такой случай и представлял, когда вспоминал об институте. У нас так и было, персональных не раздавали ;)
anonimb84a2f6fd141 03.12.2013 22:57 # +1
Бггг. У нас одна учетка на рыло, на ней и логин, и почта, итд. Так что проблема не в винде, а в недоадминах.
В такой ситуации надо было гостя юзать, там настройки после логаута смывались.
Stertor 03.12.2013 22:59 # −1
Бггг. У нас одна учетка на рыло
жжошь, сотона! Уау!
TarasB 01.12.2013 13:18 # +105
anonimb84a2f6fd141 01.12.2013 15:36 # −1
Stertor 01.12.2013 15:43 # +1
ТБ/АН, плюсанул.
anonimb84a2f6fd141 01.12.2013 15:49 # +2
Stertor 01.12.2013 15:55 # −1
Stertor 01.12.2013 17:06 # −2
anonimb84a2f6fd141 01.12.2013 22:47 # −3
Stertor 02.12.2013 00:07 # −5
anonimb84a2f6fd141 02.12.2013 02:11 # −5
Stertor 02.12.2013 09:46 # −4
Stertor 02.12.2013 19:24 # −4
guest 07.12.2013 21:24 # −4