Конкурс "Системный Администратор 2013", Первые IT-шные олимпийские игры |
Здравствуйте, гость ( Вход | Регистрация )
Конкурс "Системный Администратор 2013", Первые IT-шные олимпийские игры |
24.8.2013, 14:56
Сообщение
#181
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
Decker, а ты чем реверсил? я Восстанавливал код ручками с дизасма IDA. у тебя гораздо читабелнее получилось. IDA + HexRays Decompiler. Айс вещь. -------------------- |
|
|
24.8.2013, 17:39
Сообщение
#182
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
Идеи по-поводу crypto есть какие-нибудь? Заменить его нельзя ... нет прав ... что происходит с /tmp/root/encrypted в конечном итоге-то? Мы туда можем записать что хотим. Алгоритм шифрования известен. Что это нам даст? Запустить /tmp/root/encrypted мы к сожалению не можем ((
Я вытащил оттуда бинарник open_door, дизассемблировал, вообщем оно пишет в /dev/clipboard некий правильный ответ. Больше ничего в open_door не происходит. Плюс, для выполнения задания надо так или иначе ее запустить, но сделать этого мы тоже не можем ) -------------------- |
|
|
24.8.2013, 18:05
Сообщение
#183
|
|
Newbie Группа: Пользователи Сообщений: 5 Регистрация: 24.8.2013 Пользователь №: 1680 |
У меня есть единственное предположение - это написать эксплоит. Там шифрованная строка передаётся аргументом для fprintf, по идее, можно эксплуатировать переполнение буфера и запустить shellcode, который запустит open_door. Скажите, я совсем отчаился или это требуемый вариант =)? Мне кажется это сложнова-то так то.
|
|
|
24.8.2013, 18:12
Сообщение
#184
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
У меня есть единственное предположение - это написать эксплоит. Там шифрованная строка передаётся аргументом для fprintf, по идее, можно эксплуатировать переполнение буфера и запустить shellcode, который запустит open_door. Скажите, я совсем отчаился или это требуемый вариант =)? Мне кажется это сложнова-то так то. Да ну ... как-то это ... ) Вообщем за такое задание надо 5000 баллов давать по местным меркам. Надо подумать где может использоваться (или как можно использовать) /tmp/root/encrypted ... Алгоритм мы знаем, туда можно записать что угодно. Есть наверняка какая-то фишка, которая его использует. Только вот какая? p.s. Сейчас читаем SUID и безопасность )) p.p.s. А может быть дело в аргументах fprintf? Там она вызывается как fprintf(v3, (const char *)&v1);, где v1 - зашифрованная строка. Насколько я помню формат-то такой: fprintf (stream, format-string [, argument ...]); ... т.е. первым аргументом идет форматная строка ... может быть за счет форматной строки мы как-то можем перенаправить вывод в другой файл, нет? -------------------- |
|
|
24.8.2013, 19:08
Сообщение
#185
|
|
Newbie Группа: Пользователи Сообщений: 5 Регистрация: 24.8.2013 Пользователь №: 1680 |
p.p.s. А может быть дело в аргументах fprintf? Там она вызывается как fprintf(v3, (const char *)&v1);, где v1 - зашифрованная строка. Насколько я помню формат-то такой: fprintf (stream, format-string [, argument ...]); ... т.е. первым аргументом идет форматная строка ... может быть за счет форматной строки мы как-то можем перенаправить вывод в другой файл, нет? Decker, я тебе про это и писал =). такая уязвимость называется переолнение буфера. Можно прочитать из памяти, записать в память, выполнить свой код. Вот последнее очень подойдёт, только нужно сгенерировать shellcode, а я никак не могу на этой виртуалки закомпилить примеры, что бы загенерировать себе shellcode |
|
|
24.8.2013, 19:15
Сообщение
#186
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
Decker, я тебе про это и писал =). такая уязвимость называется переолнение буфера. Можно прочитать из памяти, записать в память, выполнить свой код. Вот последнее очень подойдёт, только нужно сгенерировать shellcode, а я никак не могу на этой виртуалки закомпилить примеры, что бы загенерировать себе shellcode Хорошо ... ты думаешь что если после шифрования на вход fprintf подастся строка, например, '%s\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90 ...' (ну может быть большей длины), то в конечном итоге fprintf будет искать данные для аргумента %s и NOP'ы (0x90) выполнятся? p.s. Судя по стене разработчиков один человек уже решил это задание ... Чертос-2 ... ) p.p.s. Кстати, вот полный текст того как инициализируется это задание (вытащить можно из hda000001395 и hda000001396) ... Т.е. помимо того, что можно посмотреть в исходном коде html. init_q5.7z ( 3,44 килобайт ) Кол-во скачиваний: 36 -------------------- |
|
|
24.8.2013, 19:30
Сообщение
#187
|
|
Junior Member Группа: Пользователи Сообщений: 99 Регистрация: 14.8.2013 Пользователь №: 1665 |
Ну и если у кого какой другой план зреет - пишите, не стесняйтесь )) Вроде бы получилась рабочая программа, посчитал все, но результат баллов не принес Два раза проверил, вроде бы все верно. Надо еще раз с самого начала все обдумать и проверить... Алгоритм основан на методе перебора всех возможных комбинаций головоломок (верных и не верных). Их у меня получилось ровно 4000. При переборе выбираются те головоломки, которые могут быть решены перестановкой одной спички (верные и не верные равенства) и параллельно подсчетом только верных вариантов. Т.к. некоторые головоломки можно решить несколькими способами, а посчитать требуется головоломки, имеющие хотябы одно решение, при подсчете учитывается этот момент, иначе результат будет завышен. Перебор осуществляется последовательным выполнением 2х процедур (примерно как Decker предлагал): 1. Перестановка спички в пределах одной цифры или знака (как показано в примере к заданию). 2. Перестановка спички с одной цифры (знака) на другую. Каждая цифра и знак проверяется по 3м таблицам (как и предлагал Decker): МИНУС_СПИЧКА, ПЛЮС_СПИЧКА, ПЛЮС_МИНУС_СПИЧКА: ПЛЮС_СПИЧКА: 0->8 1->7 5->6 5->9 6->8 9->8 '-'->'+' '-'->'=' МИНУС_СПИЧКА: 6->5 7->1 8->0 8->6 8->9 9->3 9->5 '+'->'-' '='->'-' МИНУС_ПЛЮС_СПИЧКА: 0->6 0->9 2->3 3->2 3->5 5->3 6->0 6->9 9->0 9->6 Итого имеем: Всего головоломок для перебора: 4000 Всего возможных решений: 26280 Правильных решений головоломок: 1352 и наконец, головоломок, имеющих хотя бы одно правильное решение: xxxx (не буду публиковать тут цифру, хотя она и не правильная). |
|
|
24.8.2013, 19:40
Сообщение
#188
|
|
Newbie Группа: Пользователи Сообщений: 5 Регистрация: 24.8.2013 Пользователь №: 1680 |
Хорошо ... ты думаешь что если после шифрования на вход fprintf подастся строка, например, '%s\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90 ...' (ну может быть большей длины), то в конечном итоге fprintf будет искать данные для аргумента %s и NOP'ы (0x90) выполнятся? Ну примерно так. Написать в этот шелл код вызов /root/open_door и всё. Мы вызвали открыте двери всего лишь правильно сформировав сообщение для crypto. Только, для чистоты, сначала нужно вызвать ls -ls /root чтобы подтвердить знания о существовании этого файла (пумните, там же всё логируется. если будет читинг, то не хасчитают =)) |
|
|
24.8.2013, 19:56
Сообщение
#189
|
|
Newbie Группа: Пользователи Сообщений: 5 Регистрация: 24.8.2013 Пользователь №: 1680 |
Поповоду спичек. У меня получилось 3 ответа для трёх разных вариантов задания =D. Ну принципы везде одни и те же, отличается генерация следующего выражения. с объектной точки зрения всё просто. Есть класс СПИЧКА, которая хранит значени использована спичка или нет. Есть интерфейс СИМВОЛ (или абстрактный класс, смотря на чём пишете) который содержим методы для выдачи списка неиспользованных СПИЧЕК в СИМВОЛЕ, списока использованных, преобразования численного представления СИМВОЛА в СПИЧЕЧНОЕ (для простоты "+" - 0, "-" - 1, "=" - 2) и преобразование СИМВОЛА в строковое представление. Есть классы ЦИФРА и ЗНАК, реализующие интеррфейс СИМВОЛ. Есть класс ВЫРАЖЕНИЕ, которое хранит 5 СИМВОЛОВ, а точнее 3 ЦИФРЫ и 2 ЗНАКА. Теперь всё что нужно это написать генерацию выражений от первого до последнего (вот здесь и проблема =)) и далее, для каждого сгенерированного выражения взять список использованных спичек и список неиспользованных (это сделать просто, просто склеить все списки от всех символов в выражении). Далее пробовать каждую использованную спичку помечать как неиспользованную, и эту спичку ставить на каждое из неиспоьзованных мест по очереди и проверять, получилось ли верное выражение или нет. Как то так.
P.S.: Собственно 3 варианта. Первый. берём вообще всевозможные варианты престановки спичек в ВЫРАЖЕНИИ. Второй. Берём всеможные комбинациии допустимых символов, тогда могут быть выражения типа 1=6=7, что не допустимый шаблон, но он может стать жопустимым 1+6=7. Ну и третий это когда генерируются только допустимые шаблоны. Ответ во втором и третьем 3-его порядка, а в первом 4-ого. Вот так вот =) |
|
|
24.8.2013, 20:25
Сообщение
#190
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
Может кому пригодится для задания про дверь. Версия утилиты cryptomy, которая пишет в /tmp/encrypted ... можно использовать для тестов. Как запустить?
1. В консоли вставляем текст - console.7z ( 3,27 килобайт ) Кол-во скачиваний: 45 или http://pastebin.com/mJpR4kxU 2. Жмем paste to clipboard 3. В консоли . /dev/clipboard 4. Потом /tmp/cryptomy -------------------- |
|
|
24.8.2013, 21:11
Сообщение
#191
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
По-поводу спичек ... может попробовать погуглить на тему "Matchstick Equations", "matchstick equation problems"? Наверняка подобные классы уже кем-то реализованы. Я пока что нагуглил только ролик в котором наглядно показывают что одна головоломка имеет несколько решений ) Вообщем пока что прогресса особенного нигде нет ((
p.s. По-поводу двери ... я попробовал подавать на вход fprintf различные форматные строки. Например '%s%s%s%s%s%s%s%s' ни к каким ошибкам не приводит, а если например подать туда '0x%08x\n' то в encrypted мы увидим форматированное в hex число ... Не думаю что там дело в exploit'e ... решение должно быть более простым. p.p.s. Ну и плюс я начал писать класс работы со спичками ... ) Правда когда смогу закончить - не знаю. Trianit прав, всего вариантов головоломок (т.е. изначального размещения спичек) - 4000. p.p.p.s. Да ... еще у меня пробует перебираться пароль root'а от двери )) Пробует - потому что скорость перебора SHA-512 составляет ~95p/s )) -------------------- |
|
|
24.8.2013, 21:38
Сообщение
#192
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
Trianit Алгоритм простой на самом деле. Берем перебор по 4000 головоломок. Дальше всего два варианта - последовательный вызов МИНУС_СПИЧКА, ПЛЮС_СПИЧКА (перебор по очереди с какого места берем и на какое ставим), второй вариант - вызов МИНУС_ПЛЮС_СПИЧКА. Если программим на PHP пишем ВСЕ получившиеся варианты в массив (!) ... в итоге для одной изначальной комбинации мы получаем массив выражений, которые можно получить перестановкой одной спички. Далее проверяем их ... например с помощью функции check_eq:
(просьба не ржать, накидал на коленке только что) Код function check_eq($eq) { $res = false; $sign1 = $eq[1]; $sign2 = $eq[3]; $a = intval($eq[0]); $b = intval($eq[2]); $c = intval($eq[4]); // a op b = c if (($sign1 != "=") && ($sign2 == "=")) { if ($sign1 == "+") { $res = ($a+$b==$c); } if ($sign1 == "-") { $res = ($a-$b==$c); } } // a = b op c if (($sign1 == "=") && ($sign2 != "=")) { if ($sign2 == "+") { $res = ($a==$b+$c); } if ($sign2 == "-") { $res = ($a==$b-$c); } } return (boolean)$res; } Если она true для хотя бы одного элемента массива (дальше можно не проверять), значит выражение верное и мы увеличиваем счетчик решений на 1 ... т.е. изначальное положение спичек - есть верная головоломка. Ну и так по всем 4000 ... Результат будет ответом )) -------------------- |
|
|
24.8.2013, 21:42
Сообщение
#193
|
|
Newbie Группа: Пользователи Сообщений: 5 Регистрация: 24.8.2013 Пользователь №: 1680 |
p.s. По-поводу двери ... я попробовал подавать на вход fprintf различные форматные строки. Например '%s%s%s%s%s%s%s%s' ни к каким ошибкам не приводит, а если например подать туда '0x%08x\n' то в encrypted мы увидим форматированное в hex число ... Не думаю что там дело в exploit'e ... решение должно быть более простым. Ну блин, что ты всякую хрень пробовал =)? Нужно конкретно взять и написать shellcode для вызова execve("/root/open_door", NULL, NULL); во всё. Те форматные строки что ты подавал это чушь. Я просто заколебался уже с этим тормознуты эмулятором, там просто не компилируются некоторые вещи, бесит, в общем. |
|
|
24.8.2013, 21:47
Сообщение
#194
|
|
Junior Member Группа: Пользователи Сообщений: 124 Регистрация: 10.8.2012 Пользователь №: 1249 |
Так, к списку минус_плюс_спичка надо добавить
+-> = = -> + у меня одна пара была пропущена в списке плюс_спичка, в итоге получил ответ меньше 1000 я делал так - перебирал всевозможные варианты валидных начальных условий, а затем гонял сначала плюс минус спичка для каждого символа по таблице и проверял валидность решения Код sub check_solution { my $expr = shift; my @parts = split( "=", $expr ); return 0 if ($#parts != 1); my $val0 = eval( $parts[0] ); my $val1 = eval( $parts[1] ); my $res = ($val0==$val1)?1:0; $solution = $expr if $res; return $res; } потом гонял минус спичка с символа, плюс спичка на каждый из остальных и опять проверял валидность решения -------------------- -- Real programmers never sleep. They enter brainsaver mode.
|
|
|
24.8.2013, 21:47
Сообщение
#195
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
Ну блин, что ты всякую хрень пробовал =)? Нужно конкретно взять и написать shellcode для вызова execve("/root/open_door", NULL, NULL); во всё. Те форматные строки что ты подавал это чушь. Я просто заколебался уже с этим тормознуты эмулятором, там просто не компилируются некоторые вещи, бесит, в общем. У меня нет опыта написания шеллкодов ... т.е. теоретически я все представляю ... и если бы был удобный отладчик ... все бы было видно, я бы может и написал (спустя пару месяцев ) ... но ... увы ) Мне кажется эксплоит это перегиб. Так можно дойти и до того, что вообще попробовать найти какой-то эксплоит для Linux reverse-me 2.6.20 #1 Fri Aug 16 16:52:59 YEKT 2013 i586 GNU/Linux, скомпилить его там же и запустить, получив root )) p.s. Почему бы сразу не копать, допустим в направлении Local root exploit in kernel 2.6.17 - 2.6.24 (vmsplice) ? )) -------------------- |
|
|
24.8.2013, 21:57
Сообщение
#196
|
|
Junior Member Группа: Пользователи Сообщений: 124 Регистрация: 10.8.2012 Пользователь №: 1249 |
по поводу переполнения во fprintf - там не получится - только два параметра, файловый дескриптор и строка, никаких аргументов нет. Причем строка всего 255 символов
-------------------- -- Real programmers never sleep. They enter brainsaver mode.
|
|
|
24.8.2013, 22:08
Сообщение
#197
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
по поводу переполнения во fprintf - там не получится - только два параметра, файловый дескриптор и строка, никаких аргументов нет. Причем строка всего 255 символов Передаются в функцию - да, но строка интерпретируется самой функцией fprintf как форматная строка. Идея не в переполнении буфера, а в использовании атаки на строку форматирования. Чуть подробнее теории - тут. Код Пример некорректного кода: printf(" Current status: 99 % stored."); -------------------- |
|
|
24.8.2013, 22:10
Сообщение
#198
|
|
Junior Member Группа: Пользователи Сообщений: 124 Регистрация: 10.8.2012 Пользователь №: 1249 |
Ясно, был неправл, но думаю, что это не тот путь.
-------------------- -- Real programmers never sleep. They enter brainsaver mode.
|
|
|
24.8.2013, 22:33
Сообщение
#199
|
|
Junior Member Группа: Пользователи Сообщений: 40 Регистрация: 10.8.2012 Пользователь №: 1262 |
Ребята, подскажите пожалуйста по 4 вопросу, там где список адресов. Или здесь или в личку.
Что с ними уже не делалось, от рисования карт до преобразования в различные хеши и производные алгоритмы. От игр со странами до шаманства с ДНС данными. |
|
|
24.8.2013, 22:37
Сообщение
#200
|
|
Администратор Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 |
Ребята, подскажите пожалуйста по 4 вопросу, там где список адресов. Или здесь или в личку. Что с ними уже не делалось, от рисования карт до преобразования в различные хеши и производные алгоритмы. От игр со странами до шаманства с ДНС данными. Ууух ... все проще ... байты IP'шников просто пишешь в файл ... как символы ... ну а дальше все увидишь и поймешь. -------------------- |
|
|
Текстовая версия | Сейчас: 31.1.2025, 9:56 | |