- 1
- 2
.686
.model tiny
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+143
.686
.model tiny
Весьма специфичная ошибка при использовании masm32.
JeremyW 14.12.2013 16:47 # +5
.666
.model 90-60-90
Stertor 14.12.2013 21:53 # −7
Stertor 15.12.2013 14:01 # −5
За что минус?
anonimb84a2f6fd141 16.12.2013 02:41 # +2
2. Кто-то рандомно ебошит карму.
LispGovno 14.12.2013 22:10 # +7
wvxvw 25.12.2013 22:33 # 0
LispGovno 25.12.2013 23:29 # 0
wvxvw 25.12.2013 23:54 # +2
bormand 14.12.2013 17:07 # +2
P.S. Меня вот masm32 смущает в сочетании с tiny, аля .com...
P.P.S. Последний раз юзал masm и tasm лет 8-9 назад, может быть поэтому ошибка не по глазам... Кому-то еще нужны эти поделия, когда есть полноценные и кроссплатформенные макроассемблеры типа nasm'а?
inkanus-gray 14.12.2013 19:55 # +1
bormand 14.12.2013 19:55 # +1
Unfortunately, MASM often defaults to 32 bit mode whenever you select an 80386 or later processor using a directive like .386, .486, or .586 in your program.
<...>
If you use one of the directives to activate the 80386 or later instruction sets, you should put use16 in all your code segments.
inkanus-gray 14.12.2013 20:28 # +3
P.S. Хотел спросить, а чем же тогда отличается FLAT от TINY, но потом сам понял: в модели FLAT сегменты кода и данных по умолчанию не объединяются в группу.
anonimb84a2f6fd141 15.12.2013 01:53 # +2
LispGovno 15.12.2013 01:57 # +1
anonimb84a2f6fd141 15.12.2013 02:24 # +1
LispGovno 15.12.2013 08:08 # 0
bormand 15.12.2013 08:30 # 0
anonimb84a2f6fd141 15.12.2013 09:51 # +4
>DOS
/0. Тогда было модно делать самомодифицирующийся код. Ёба, ком - это исполняемый образ без заголовков.
bormand 15.12.2013 08:28 # +4
В винде, насколько помню, в конце стека помещается guard page, при касании которой к стеку подклеиваются еще странички. А дальше - пустота. За обращение к пустоте программу убивают с access violation. Так что маловероятно, что ты ростом стека запорешь сегмент данных.
P.S. Кстати поэтому на старых виндокомпиляторах был забавный баг - пишешь локальный массив килобайт на 8, и касаешься первого элемента - прога вылетает с access violation, хотя места под стек еще полно :)
А для доса - да, защиты памяти нет, можно спокойно портить код и даные. Что случится - а х.з. либо прога попадет в случайный цикл, либо напорется на неизвестный опкод. У меня обычно выводилось немного мусора и прога висла.
LispGovno 15.12.2013 08:35 # +1
bormand 15.12.2013 08:45 # 0
anonimb84a2f6fd141 15.12.2013 09:54 # −1
bormand 15.12.2013 11:37 # +2
Ну я надеюсь, что только в образовательных целях? :)
Ну если нет NX и ASLR - можно попробовать поместить шеллкод в тот самый буфер и перезаписать адрес возврата, который попадет в eip, так, чтобы он попал на посадочную полосу перед шеллкодом. Классика жанра ;)
Если есть NX, то этот метод не проканает, и придется снимать защиту от исполнения на буфере с шеллкодом. Для этого, с помощью ROP*, тебе придется вызвать некую апишку (например VirtualProtect, если это винда).
Если есть и ASLR - то будет туго. Придется искать библиотеки, которые грузятся по статическому адресу (в линухе, это только сам экзешник, если он собран без -pie), и юзать ROP только на них.
Если ASLR тотальный (64 битная линуха, экзешник откомпилен с -pie), то придется лососнуть тунца, и забить на переполнение буфера :)
* ROP - return-oriented programming. Ты ищешь кусочки кода с нужными тебе инструкциями, стоящими прямо перед ret. Затем аккуратно раскладываешь в стеке адреса этих кусочков в нужном порядке. Каждый ret будет вынимать адрес следующего кусочка из стека и прыгать на следующий кусочек..
LispGovno 15.12.2013 12:35 # 0
> забить на переполнение буфера
И как тогда? 64 винда и линь стоит уже почти везде.
bormand 15.12.2013 13:08 # +2
Лососнуть тунца... не зацикливаться на переполнении буфера... смириться, с тем, что оно осталось в прошлом веке (не только благодаря ASLR, но и языкам типа жабы, решетки и т.п.)... уйти в запой и выйти в окно... искать другие методы взлома :)
> не понял про ROP.
Что именно? У меня у самого про ROP познания чисто теоретические, т.к. не было повода их применить.
Поскольку ты переполнил буфер, ты можешь разложить вверх по стеку нужные тебе адреса и значения. Когда процедура, в которой переполнили буфер, выполнит ret, она прыгнет по первому указанному тобой адресу, выполнит одну-две ассемблерных инструкции, и наткнется на ret. Котрый извлечет из стека второй указанный тобой адрес, и прыгнет на него, там кусочек кода выполнит еще пару инструкций и следующий ret...
Работа кропотливая, чем-то похожая на составление паззла, но вполне реализуемая, и, наверное, даже автоматизируемая ;)
Если же ASLR нету - можно почти не париться с кусочками (немного все-таки придется, чтобы как-то поместить на стек адрес шеллкода), а раскладывать на стеке аргументы и адреса нужных апишек.
bormand 15.12.2013 13:44 # +3
P.S. Грань между хакером и безопасником, имхо, очень тонкая. Знания у них практически одинаковые, разница только в целях ;) Состояние стека будет примерно таким: Один из способов выполнить exit(42) - положить 1 в eax и 42 в ebx и вызвать прерывание 0x80. Ищем подходящие кусочки кода в экзешке. Допустим нам повезло, и мы нашли: Значит на вход программе нужно подать <32 байта хлама (+4 если есть фреймпоинтер)> 0x56 0x34 0x12 0x00 0x21 0x43 0x65 0x00 0xAD 0xDE 0x00 0x00. ret внутри vulnerable снимет со стека адрес первого кусочка, в eax попадет 1, рет из первого кусочка снимет со стека адрес второго, в ebx попадет 42, рет в нем снимет адрес последнего кусочка, и вуаля, программа завершилась с кодом 42 ;)
LispGovno 15.12.2013 16:44 # 0
олсо круто!
bormand 15.12.2013 16:50 # +2
Об этом гцц как бы намекает при компиляции ;)
anonimb84a2f6fd141 16.12.2013 02:48 # +1
Если под безопасником имеется в виду пентестер, то да, а так задача не совсем совпадает. Если у меня будет задача избавить код от скуль, я не буду искать, как их эксплуатировать, я просто заменю все запросы на параметризированные - выйдет быстрее и шаблонно.
bormand 16.12.2013 06:38 # 0
Ну здесь что имеется в виду. В обоих случаях ты знаешь о наличии этой уязвимости, ты знаешь о том, как она выглядит в коде (непараметризованный запрос без экранирования) и как ее устранить. Вот эти знания они общие что для защиты, что для атаки.
Специфика да, она безусловно есть. Но базовые знения то общие ;)
anonimb84a2f6fd141 16.12.2013 09:12 # 0
Точно так же не обязательно уметь писать сплоиты к переполнениям буфера, чтобы не допускать их.
bormand 16.12.2013 10:44 # 0
Ну да, я примерно представляю, как это делается, но на практике - скорее всего не смогу, от недостатка опыта.
P.S. Фаерфокс упал 2 раза от нажатия на кнопку "ответить". Переполнение буфера от специально сформированного комментария? :)
Stertor 17.12.2013 14:05 # +1
anonimb84a2f6fd141 16.12.2013 02:45 # +1
anonimb84a2f6fd141 16.12.2013 02:44 # 0
bormand 16.12.2013 06:58 # 0
Я тоже, на практике не пробовал ;)
> С чего начать?
С книги "Как научиться ломать сервера через переполнение буфера для чайников" :)
> Можно как-то готовый из metasploit присобачить?
Я не в курсе, что metasploit умеет ;(
anonimb84a2f6fd141 16.12.2013 09:15 # 0
А кто бы мог помочь с ним или даже сколько будет стоить такое заказать?
Там есть готовые payload-ы, connect, reverse connect, с просто шеллом и даже что-то покруче.
Stertor 15.12.2013 14:00 # +2
anonimb84a2f6fd141 15.12.2013 09:52 # 0
LispGovno 14.12.2013 22:03 # +3
Если делать так:
.686
.model tiny
То получаю 32хбитный код, но если обменять строки местами, то получаю 16тибитный. о_О
В обоих случаях никаких ошибок компиляции (или ассемблирования?). Заводил только один сегмент .code
LispGovno 14.12.2013 23:53 # +2
Stertor 15.12.2013 14:02 # +2
anonimb84a2f6fd141 16.12.2013 02:49 # −2
bormand 16.12.2013 07:00 # −1
masm32 и tasm то? Так и есть ;)
anonimb84a2f6fd141 16.12.2013 09:16 # −2
LispGovno 14.12.2013 22:09 # 0
bormand 14.12.2013 22:28 # +2
Досовские .com - без проблем, т.к. заголовков никаких не нужно. bits 16 и погнали.
Досовские .exe - напрямую не умеет, зато умеет obj в OMF формате, которые, по идее можно долинковать любым досовским компоновщиком.
На самый-самый крайний случай можно досовский заголовок собрать тупо директивами db/dw. Там же в основном константы да смещения, которые легко считаются как расстояние между двумя метками.
> Хотя кому это нужно...
Вот именно ;)
LispGovno 14.12.2013 22:42 # 0
Это как-то не интересно. Хочется всё из коробки стандартными средствами ассемблера.
> На самый-самый крайний случай можно досовский заголовок собрать тупо директивами db/dw
Когда-то смотрел на их сайт. Так и написано в его доках. Это же извращение.
> Вот именно ;)
Предлагаю забить на асм и обсудить что-нибудь полезное.
Сейчас наблюдаю какой-то иностранный форум и там плывет дата постов. Часа 3 назад все посты были в пределах 2 AM и после все пошли спать, а теперь там у всех постов 5 AM. Как такое возможно?
bormand 14.12.2013 23:07 # +2
Ну почему. Можно же сделать набор макросов для этого, и поместить его в отдельный инклудник ;)
> Часа 3 назад все посты были в пределах 2 AM и после все пошли спать, а теперь там у всех постов 5 AM
1) Админ перевел часы на серваке.
2) Админ сменил часовой пояс на серваке.
3) Ты сменил часовой пояс в профиле.
Vasiliy 14.12.2013 23:26 # +5
LispGovno 15.12.2013 12:36 # +1
LispGovno 15.12.2013 16:49 # +1
Например всего 50 серваков. А проектов 10. Когда на одном из проектов максимальная нагрузка, то ему отдают 41 машину. Остальным, если нагрузки нет, то им по одной машине. Когда нагрузка поменялась, то например 10 машин - одному проекту, 32 другому, а 8 оставшимся (каждому по одному).
anonimb84a2f6fd141 16.12.2013 02:50 # 0
LispGovno 16.12.2013 08:35 # 0
bormand 15.12.2013 13:19 # +2
LispGovno 14.12.2013 23:51 # +2