Как стать автором
Обновить

Комментарии 61

Гениально! :)
Извините, а что здесь гениального?
Гениально то, что автор собеседуется на позицию инженера программной безопасности, и при этом запускает неизвестные программы под рутом (;
судя по

root@lisa:~# ./CrackTheDoor


UPD: я буду читать комментарии…
Рут на виртуалке — это Серьёзно. Нельзя запускать ничего из-под Рута на инстансе, который живёт 5 минут. Ведь это же Рут.
внизу уже ответили за меня…
ну понятно что в виртуалке, но так же понятно что нет никаких причин чтобы производить исследование под рутом, а значит он сделал это по привычке… плохая привычка для безопасника, не находите?
те кто не согласен, вы считаете что работа под рутом это хорошая привычка или вы считаете что под рутом были основания работать, никак не пойму с чем конкретно не согласны…
Если бы был не просто XOR, а комбинация хотя бы ADD и XOR — это был бы… ну, крякмис начального уровня.
Ну и в целом. В данной проге достаточно пропатчить один бит (заменить je на jne по адресу 0x8048898) и, в общем, всё.
Ну, справедливости ради стоит сказать, что в крякерской среде, замена условных переходов на безусловные считается грязным хаком и признаком дурного тона, если угодно. В статье написано, что попросили найти пароль, а не тупо «открыть дверь».
И не получить работу, ибо это не то что требовалось.
НЛО прилетело и опубликовало эту надпись здесь
Компания прислала третью часть. Оказалось, я попал в неподходящую компанию и теперь иду по статье.
Ну, пример-то явно учебный…
а в IDA/hex rays это не проще было сделать?
IDA и Hex-Rays надо вначале купить, не?
Ида точно есть бесплатная, но вот есть ли в ней загрузчик ELFов — вопрос.
Когда это было проблемой для инженера по безопасности?
мм, что за кино?
SWORDFISH, это ж культовый фильм ))
Ну я бы так не сказал ) Культовые фильмы с Анжелиной, Сандрой и Киану, а этот на другое поколение и целевую аудиторию рассчитан )
Он вообще интересный.

НЛО прилетело и опубликовало эту надпись здесь
Соискатель на позицию безопасника запускает неизвестные файлы под рутом?
Скорее всего в виртуалке
А зачем даже в виртуалке запускать от рута? Тем более что дальше идут запуски от обычного пользователя (включая и финальный запуск со вводом правильного пароля), а значит рут в принципе не требовался.
Вот интересна логика минусующих. Мол, если виртуалка, то можно и из-под рута, да? А ничего, что программа, будучи запущенной из-под рута, могла, скажем, пропатчить основные отладочные утилиты (gdb, strace, ldd), что сделало бы задачу… м-м-м… скажем так, еще более увлекательной?
Но я думаю не на продакшен же сервере… Специально поднятая виртуалка как вариант.
Я поставил breakpoint на PJeGPC4TIVaKFmmy53DJ

До этого это имя вроде не упоминается. Откуда оно?
Я не особо много пользовался gdb, но предположу, что это какой-то алиас к адресу. Вот эта строчка:
=> 0x08048534 <PJeGPC4TIVaKFmmy53DJ+0>
Я тоже, но предполагаю что это обфусцированное название функции.
И строчка эта указана уже после того как был установлен брекпоинт.
Как понять обфусцированное название функции? Название функции можно получить только в паре случаев: экспортированное имя, наличие отладочной информации рядом (pdb, к примеру) [возможны еще ситуации, но слишком много нюансов]. Названия функций не хранятся в скомпилированных приложениях.
В Unix-мире — хранятся, если их специально не вырезать.
root@lisa:~# file CrackTheDoor
CrackTheDoor: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, BuildID[sha1]=0x9927be2fe310bea01d412164103b9c8b2d7567ea, not stripped
Тогда минусуйте мой следующий коммент про нейминг из читабельных символов к хренам, проверить не мог — с мобилы, но не думал что такая подстава с именами фунок будет.
Оба имени рождены из двух наборов байт (в ASCII), образующих 16-байтовые массивы для функций (де)шифрования. Автору было так проще ориентироваться, это его нейминг. Updated: Ну, не прям из них, но частично. Он просто скопировал из hex-viewer'а читабельные символы этой области, скорее всего.
Автору программы или статьи?
Я так понимаю что это нейминг автора программы.
Я не понял где присваивается или узнается этот нейминг.
По сути Вы использовали gdb только в качестве дизассемблера. Для этого проще использовать objdump. И не нужно обходить ptrace.
НЛО прилетело и опубликовало эту надпись здесь
В первый раз он использовал gdb 'r' (run) — запустил ее под отладчиком просто, потом gdb 'info file' — получил информацию об исполняемом файле, в том числе его точку входа.
Потому что он настроил анти-антиотладку
НЛО прилетело и опубликовало эту надпись здесь
Запускать неизвестные бинарники из-под рута? Мужик, ты не прошел собеседование.
Кстати, идея для подобного бинарника: можно ведь в системе немного подменить gdb, чтобы он немного глючил, и/или strace, ну и вообще подобные какие-нибудь программы. Понятное дело, что придётся предусмотреть разные дистры и вот это всё, но результат может быть забавным.
В перспективе — инициирует запуск Skynet и отправку роботов-терминаторов из будущего по адресу кандидата. Так, мысли вслух… :)
If you want to try it yourself, send me an email for binary.

А кто-нибудь запросил бинарик у автора для тренировки?
crackmes.de — выбирай любой из тысяч. Там есть такие, от которых волосы дыбом встанут.
А нельзя было в момент запроса пароля сделать core файл командой gcore, потом загрузить его в gdb, подняться вверх по стеку и дальше смотреть по контексту что там делается?
Как по мне — очень странно, что такое дают на собеседованиях. На crackmes.de есть множество таких крякми, незатейливо использующих xor (у всех сложность 1 / 9).
И в чём заключается работа инженера программной безопасности, если не секрет?
Работа заключается в написании крякми для новых кандидатов.
Для нового кандидата.
Поделился бы что ли бинарником, чтобы другие тоже могли поковырять…
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Автору поста: ИМХО код в таком оформлении

int main()
{
    if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) {
        printf("DEBUGGING... Bye\n");
        return 1;
    }
    printf("Hello\n");
    return 0;
}


читается гораздо лучше, чем код в таком оформлении:

int main()
{
    if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) {
        printf("DEBUGGING... Bye\n");
        return 1;
    }
    printf("Hello\n");
    return 0;
}
Так 2 часть будет или автор уже получил работу?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации