![image](https://habrastorage.org/webt/m1/pb/cc/m1pbccvddfkceg8p7pjztg2-uds.jpeg)
В данной статье 5 первых заданий, узнаем основы дизассемблирования, решим задачи начального уровня реверса, а также декомпилируем dotNet приложение.
Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
- PWN;
- криптография (Crypto);
- cетевые технологии (Network);
- реверс (Reverse Engineering);
- стеганография (Stegano);
- поиск и эксплуатация WEB-уязвимостей.
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
C, GCC32
Рассмотрим самый простой случай. Это первое задание на реверс.
![image](https://habrastorage.org/webt/i5/wd/b2/i5wdb24fgbf5apypd5kyimpecsu.png)
В заданиях такого типа, когда пароль хранится в виде строки, его можно найти не использую никаких специальных средств. Давайте запустим программу, и посмотрим что она выводит.
![image](https://habrastorage.org/webt/jk/vz/uv/jkvzuvoyibqyaupth-mlqyzn8ry.png)
Отлично. У нас есть приглашение и сообщение о неверном пароле. Просмотрим строки в файле программы, при этом найдем среди них приглашение и сообщение о неверном пароле. Рядом должен быть пароль.
![image](https://habrastorage.org/webt/st/zf/aw/stzfawpqh_d1ottvit4617z4ste.png)
Таким образом, из расположенных рядом строк, есть одна, похожая на пароль. Попробуем ее.
![image](https://habrastorage.org/webt/9t/c3/9z/9tc39zmm1jub41texeogphlxmyg.png)
Задание выполнено. Сдаем пароль, получаем 5 очков.
![image](https://habrastorage.org/webt/kc/js/x4/kcjsx4_ons-rcz_uqxsvycorkcm.png)
ELFx86, Basic
Нас просят найти пароль.
![image](https://habrastorage.org/webt/ad/3r/hn/ad3rhnt8hw6dxldlj__ffqwae74.png)
Загрузим программу в отладчик IDA Pro (я пользуюсь версией 7.0) и нажмем F5, чтобы декомпилировать программу.
![image](https://habrastorage.org/webt/r3/e5/ka/r3e5kafg6tczq7pjnnvcsm8oopq.png)
Таким образом введенное имя сравнивается со строкой john, а пароль — с the ripper.
![image](https://habrastorage.org/webt/do/zm/tc/dozmtcp4uxa0yrqqhnr966wvuhy.png)
Таким образом мы верно решили задание и получаем свой пароль. Сдаем его и зарабатываем еще 5 очков.
![image](https://habrastorage.org/webt/uz/c1/tc/uzc1tc223n9cyrlqy3xiwwx3yg8.png)
PEx86, 0 protection
На сей раз нам дают exe-шник.
![image](https://habrastorage.org/webt/e7/l7/hh/e7l7hhwhfhq2pejorbt0cmaeupy.png)
Загружаем его в IDA Pro.
![image](https://habrastorage.org/webt/ar/yr/3p/aryr3pwyshs8khx9zec8vnsk1qi.png)
В программе не сохранена отладочная информация, поэтому мы не видим привычных нам названий функций типа main. Давайте просмотрим строки в программе, для этого нажмем +F12.
![image](https://habrastorage.org/webt/1z/aq/d_/1zaqd_avjjfqfklvovfs9lltuzy.png)
Видим сообщения о вводе правильного и неправильного паролей. Теперь мы можем найти блок с этой строкой в коде и посмотреть какое условие ему предшествует. Кликнем на строку два раза.
![image](https://habrastorage.org/webt/yx/9p/kq/yx9pkqi68ysgb1qnmg0zw7tpapy.png)
Мы находимся в секции rdata. Давайте найдем все ссылки в коде на этот адрес. Для этого нажмем X.
![image](https://habrastorage.org/webt/dq/jx/xd/dqjxxd5ziy3spbwob5a_fu9rshi.png)
Таким образом в коде программы есть всего одно обращение к нашей строке. Кликаем два раза и переходим в код.
![image](https://habrastorage.org/webt/vr/6f/mm/vr6fmmiqgtz3mpy2twxpf881uo8.png)
Мы находимся в основном коде программы. Декомпилируем.
![image](https://habrastorage.org/webt/cn/8_/zq/cn8_zq9ygvo-cpfvembm5b2xyem.png)
Здесь происходит проверка какого-то числа a2 и строки a1. Давайте переведем числовое в символьное.
![image](https://habrastorage.org/webt/s_/fi/tx/s_fitx1s-9tdwrzmwl9fum7dtf0.png)
Для этого необходимо на числе нажать R. И наш код преобразился.
![image](https://habrastorage.org/webt/nt/ai/hf/ntaihfdssmv729rb9vqaic3svze.png)
Строку мы теперь знаем, осталось выяснить что за число a2. Посмотрим все ссылки на данную функцию.
![image](https://habrastorage.org/webt/5r/_d/at/5r_datjqoyrvik8fflbt-ty8ar8.png)
Она вызывается всего один раз.
![image](https://habrastorage.org/webt/nt/ai/hf/ntaihfdssmv729rb9vqaic3svze.png)
Как можно увидеть в качестве второго параметра передается длина строки. Проверим найденный пароль.
![image](https://habrastorage.org/webt/ab/bq/_x/abbq_xie-heydrs9pb0skc30bi0.png)
Сдаем и получаем 5 очков.
![image](https://habrastorage.org/webt/8j/uk/7y/8juk7y3pnaotz_cqskekr8fcwm0.png)
ELF-C++, 0 protection
Нам предлагают решить программу на C++.
![image](https://habrastorage.org/webt/d9/az/1p/d9az1p-bconwz6uxu9wwsp2gm00.png)
Открываем в IDA Pro и переходим к месту вызова сообщения о правильном пароле. Давайте окрасим его в зеленый цвет.
![image](https://habrastorage.org/webt/b4/bc/oe/b4bcoel5galsyhk8ndwd8xgpjyc.png)
Сделаем граф поменьше.
![image](https://habrastorage.org/webt/mw/fs/hw/mwfshwu-zsjjtojpkah3wy1uwd4.png)
Таким образом нам нужно пройти два условия. Разберем их. В первом условии количество аргументов сравнивается с 1. То есть в программу должно быть больше одного аргумента (первый — это название программы).
![image](https://habrastorage.org/webt/q3/dn/pj/q3dnpjp7z6bhrxhqiz3bsfake7w.png)
Разберем второе условие.
![image](https://habrastorage.org/webt/p0/he/um/p0heumsrpixc2u5g0kwi006gom0.png)
Введенная нами строка сравнивается со строкой, которая передается в качестве параметра в функцию plouf. Декомпилируем ее.
![image](https://habrastorage.org/webt/qh/gi/te/qhgitehrtcx1_jx7rwxmb304pww.png)
Разбираем код. На самом деле a2 — является строкой. Таким образом, цикл выполняется от i=0, до момента пока i-й элемент строки а2 не будет равен 0 (то есть пока не достигнет конца строки).
V3 = a2[i]
V5 = length(a3)
V6 = a3[i%v5]
То есть строка по адресу a1 будет равна двум проксоренным строкам a2 и a3. Вернемся в главную функцию и найдем эти строки.
![image](https://habrastorage.org/webt/w_/4o/gx/w_4ogxgj5j9nvhosl2c1vr3_tdo.png)
Так нам нужно определить параметры var_C и var_10. Их найдем чуть выше. Это строки unk_8048ВС4 и unk_8048DCC соответственно.
![image](https://habrastorage.org/webt/fy/ym/w9/fyymw9iebcyy5m2ccawldgauoqa.png)
Найдем значение строк.
![image](https://habrastorage.org/webt/kk/8g/uv/kk8guvnatcra5tq8f_6sdvv3j_s.png)
Что же, напишем код, чтобы их проксорить.
![image](https://habrastorage.org/webt/9z/d6/gs/9zd6gsiylua9u5adskll2tjvhf4.png)
Получаем пароль.
![image](https://habrastorage.org/webt/f9/6f/ae/f96faeke0mqz6ldjv82lupddvnm.png)
PE-DotNet, 0 protection
В этом задании нам предлагают реверсить .NET приложение.
![image](https://habrastorage.org/webt/hz/l7/lq/hzl7lq_ti9ae96voyyx7gmeer4c.png)
Определить его можно с помощью утилиты file.
![image](https://habrastorage.org/webt/xy/2y/-t/xy2y-tla13ytpnbhenrpfqdmzg8.png)
C# является декомпилируемым языком, таким образом мы можем получить исходный проект. Сделать это можно с помощью dnSpy.
![image](https://habrastorage.org/webt/jy/0c/0f/jy0c0fzm-jsk1sb1ftipi6hg4tc.png)
Давайте откроем проект CrackMe и найдем функции и методы.
![image](https://habrastorage.org/webt/pt/7g/ct/pt7gcttd7tfh8wtlul4grogi998.png)
Метод Button1_Click проверяет пароль по нажатие кнопки.
![image](https://habrastorage.org/webt/cb/1o/uv/cb1ouvgr3afpw0fpzztb_pihpui.png)
В исходном коде найдем пароль. Проверем его.
![image](https://habrastorage.org/webt/gn/hg/mc/gnhgmcxja3s2-or26q2hx1qmsk4.png)
Сдаем его.
![image](https://habrastorage.org/webt/oi/oj/lb/oiojlb617qxizbktowc8e5iu54o.png)
На этом пока все. Продолжение следует… Вы можете присоединиться к нам в Telegram. Там можете предлагать свои темы и участвовать в голосовании на выбор темы для следующих статей.
Комментарии (6)
KvanTTT
12.09.2019 13:21По .NET очень просто задание — там ничего не обфусцированно (по остальному тоже но я спец по .NET). А что если применить как минимум обфускацию по шифрованию констант и по сокрытию тел методов (AntiTamper), а в идеале — все из списка ConfuserEx.2.
Кроме того, константу все равно не так сложно расшифровать, как понять логику обфусцированной программы.
Gariks
12.09.2019 21:56Ну и зачем? Ребята из root-me старались, подготавливали материал, а вы делаете «решебник». Смысл то в том что бы побудить людей к исследованию и изучению чего-то нового, а вы убиваете всю интригу.
RalfHacker Автор
14.09.2019 19:10Затем, что люди просят. Кто выбрал самостоятельный путь развития, того я не принуждаю читать разборы…
Sky-Fox
За статью спасибо. Но вы бы хоть рамку вокруг картинок сделали. Глаза разбегаются, не понятно где текст а где картинки.
RalfHacker Автор
Учту, спасибо!