Edb linux как пользоваться

Обновлено: 07.07.2024

В Unix каждому файлу соответствует набор прав доступа, представленный в виде 9-ти битов режима. Он определяет, какие пользователи имеют право читать файл, записывать в него данные или выполнять его. Вместе с другими тремя битами, влияющими на запуск исполняемых файлов, этот набор образует код режима доступа к файлу. Двенадцать битов режима хранятся в 16-битовом поле индексного дескриптора вместе с 4-мя дополнительными битами, определяющими тип файла. Последние 4 бита устанавливаются при создании файлов и не подлежат изменению. Биты режима (далее права) могут изменяться либо владельцем файла, либо суперпользователем с помощью команды chmod.

Существует три пути управления доступом к файлу или каталогу. Было определено, что каждый файл должен иметь владельца (owner), группового владельца (group owner), а также может потребоваться доступ для всех остальных пользователей (everyone). Эти названия обычно приводятся как пользователь/группа/остальные (user/group/others) или коротко ugo. Реализация управления доступом к файлам и каталогам в Unix позволяет или запрещает доступ по трем флагам: флаг чтения (Read), флаг записи (Write), флаг выполнения (eXecute). Они представляются следующим образом:

Флаг типа (flag) может быть одним из следующих:

Флаг Описание
- Отсутствие флага
l - лат. «л» Символическая ссылка (symbolic link)
d Директория (directory)
b Блочное устройство (block device)
c Символьное устройство (character device)
p Канал, устройство fifo (fifo device)
s Unix сокет (unix domain socket)

Права доступа

Посмотреть права доступа на объекты можно командой ls c ключем -l («л»). Также можно добавить ключ -a, для того,чтобы были отображены скрытые объекты:

Для назначения прав используются три группы флагов, первая определяет права для владельца, вторая - права для основной группы пользователя, третья - для всех остальных пользователей в системе.

Для файлов: r - право на чтение из файла; w - разрешает запись в файл (в частности перезапись или изменение); x - позволяет исполнить файл.

Для каталогов, флаги r w x имеют несколько отличный смысл: r - позволяет читать только имена файлов в каталоге; x - позволяет иметь доступ к самим файлам и их атрибутам (но не именам); w имеет смысл только в сочетании с x, и позволяет (в дополнение к x) манипулировать с файлами в каталоге (создавать, удалять и переименовывать). w без x - не имеет никакого эффекта.

Рассмотрим таблицу, чтобы было понятнее:

OCT BIN Mask Права на файл Права на каталог
0 000 - - - отсутствие правотсутствие прав
1 001 - - x права на выполнениедоступ к файлам и их атрибутам 1)
2 010 - w - права на записьотсутствие прав
3 011 - w x права на запись и выполнениевсе, кроме доступа к именам файлов 2)
4 100 r - - права на чтениетолько чтение имен файлов
5 101 r - x права на чтение и выполнениечтение имен файлов и доступ файлам и их атрибутам 3)
6 110 r w - права на чтение и записьтолько чтение имен файлов
7 111 r w x полные прававсе права

Для администрирования часто удобнее использовать не буквенное представление прав, а цифровое, в восьмеричном представлении (оно короче). Так, например, права на файл всем и вся, соответствуют записи 777 (что аналогично символьному представлению rwxrwxrwx).

Существуют также специальные биты, такие как SUID, SGID и Sticky-бит. SUID, SGID влияют на запуск файла, а Sticky влияет на определение владельца объектов в каталоге. При их применении необходимо использовать не три восьмеричных цифры, а 4. Зачастую, в различной технической литературе права обозначаются именно 4-мя цифрами, например 0744. Многие стараются не использовать специальные биты, сетуя на безопасность (и не без основательно), но, в некоторых ситуациях без них не обойтись. Поговорим о них несколько позже.

Давайте рассмотрим пример, итак:

Для первой строки:

Следующие три символа (rwx) обозначают права для владельца файла, в данном случае полные права для пользователя allexserv. 4) Следующие три (- - -) - определяют права для группы nogroup, в нашем примере для всех пользователей группы nogroup доступ запрещен. Ну и последние три символа (- - -) определяют права для всех остальных пользователей, в нашем случае доступ запрещен.

Восьмеричное обозначение прав для файла pro_ubuntu.zip: 0700.

Для второй строки (это каталог, о чем свидетельствует флаг «d»), по аналогии:

Для владельца каталога allexserv - полные права (rwx). Для группы nogroup - права на листинг каталога и доступ к файлам (r-x). Для пользователя «все остальные» - права на листинг каталога и доступ к файлам (r-x).

Восьмеричное обозначение в этом примере: 0755.

Для полноценного просмотра каталога, необходимы права на чтение каталога и доступ к файлам, а главное к их атрибутам, т.е. минимальные разумные права на каталог - 5 (r-x). Прав 4 (r–) хватит только на просмотр имен файлов, без атрибутов, т.е. не будут известны размер файла, права доступа, владелец.

На практике для каталогов используется только три режима: 7 (rwx), 5 (r-x) и 0 (—).

Очень любопытный режим доступа к каталогу - 3 (-wx): он позволяет делать в директории все, что угодно, но не позволяет прочитать имена объектов в директории. Т.е. если вам не известны названия объектов в этом каталоге, то вы сделать с ними ничего не сможете (даже удалить по маске * т.к. маску не к чему применять - имена то недоступны).

В каталоге с режимом доступа 3 (-wx) можно создавать новые, переименовывать и удалять файлы и каталоги (если вы знаете их имя); читать, изменять, запускать файл (если достаточно на него прав, и опять же - вы знаете его имя). Можно даже менять права доступа на файлы и каталоги (если вы знаете имя). Но самое интересное, что если вы сможете перейти (по cd 5) ) в подкаталог такого каталога (а для этого вам опять нужно знать его имя), то там у вас будет «все в ожуре» (если конечно у этого подкаталога будет нормальный режим доступа).

Никакой рекурсивный поиск/удаление тоже не сможет залезть внутрь такого каталога - ему ведь нужны названия - а их из такого каталога - никак не получить.

Но не надо думать, что такой каталог полноценно заменяет крипто-контейнер (т.е. может использоваться для хранения очень секретных данных). Да, имен объектов из такого каталога никак не получить, однако если попытаться создать объект с именем, которое уже существует, то такая операция закончится неудачей (т.е. мы получим подтверждение, что такое имя уже есть). Так же можно пытаться открыть (как файл или как каталог) объект с произвольным именем, если такого имени нет, то мы получим ошибку. Безусловно имя может быть очень длинным и шансы угадать его могут быть не велики, но не надо забывать, что права доступа могут сменить как владелец каталога так root. Да и пути доступа могут сохраниться в различных логах и файлах истории.

Команда chmod

Права устанавливаются командой chmod. Команда chmod поддерживает установку прав как в восьмеричном представлении, так и в символьном (маска режима доступа).

Синтаксис команды прост:

chmod <опции> <права> <объект или регулярное выражение>

Опции

Из самых полезных и часто используемых опций можно выделить одну:

-R - рекурсивное назначение прав. Т.е. назначить права всем объектам, руководствуясь регулярным выражением. chmod -R 755 * - Назначение прав всем объектам текущего каталога, включая подкаталоги. chmod -R 700 z* - Назначить полные права для владельца и исключить права для группы и всех остальных для всех объектов, которые начинаются именоваться на z, находящиеся в текущем каталоге и его подкаталогах. 6)

Права

Права можно записывать как в восьмеричном представлении так и в символьном. В восьмеричном представлении, для стандартных прав, указываются 3 восьмеричные цифры (1-я для владельца, 2-я для группы, 3-я для всех остальных. См. таблицу выше).

chmod 744 koshka.txt - установит права для файла koshka.txt - (r w x r - - r - -); chmod -R 775 sobaki - установит права на каталог sobaki и на все объекты, что внутри этого каталога, включая содержимое подкаталогов (r w x r w x r - x); chmod 700 * - установит права только для владельца на все файлы и каталоги в текущем каталоге, включая подкаталоги и их объекты (rwx - - - - - -).

Другой способ назначения прав - это использование маски режима доступа (символьное представление). Помимо прав задается еще кому мы собираемся эти права выставлять:

Для назначения прав используются три знака: минус, плюс или равно:

+ - добавить указанные права к существующим правам объекта; = - заменить права объекта на указанные. chmod g+w koshki.txt - Добавить пользователям группы файла koshki.txt права на запись в этот файл; chmod a=rwx sobaki.doc - Заменит существующие права на файле sobaki.doc на полные права всем; chmod o-w test.cgi - Уберет права на запись для пользователя «Все остальные». chmod ug=rw spisok.doc - Выставить права на чтение и запись файлу spisok.doc для владельца и группы. Обратите внимание, что если у пользователя «все остальные» были какие-либо права, они сохранятся в неизменном виде.

Использование символьного представления позволяет редактировать права файлов более гибко:

chmod u+x,g+w-x koshki.txt - Добавить владельцу файла koshki.txt права на его выполнение, пользователям группы разрешить запись и запретить выполнение и оставить права остальных пользователей без изменений; chmod u=rwx,g+w,go-x sobaki.doc - Установить полные права для владельца файла, разрешить пользователям группы запись и запретить выполнение всем пользователям, кроме владельца файла.

Символьное назначение окажет неоценимую услугу, если требуется добавить права на объект к уже существующим правам.

Массовое назначение прав

Иногда, бывает, нужно массово установить права на определенный тип объектов, например, только на каталоги или только на файлы. Простое использование опции -R (рекурсия) здесь не поможет т.к. chmod будет проходить по всем объектам удовлетворяющим маске, что иногда вовсе не то, что нужно.

Итак, чтобы массово установить права на определенный тип объектов можно использовать один из вариантов (вообще, их очень много):

где -type d - каталоги, -type f - файлы. В данном примере chmod установит, начиная от текущего каталога 7) , права на все каталоги (включая подкаталоги) разрешения 770 (rwx rwx- - -) при этом не трогая права на другие объекты.

Более длинный вариант аналогичной операции:

где -type d - каталоги, -type f - файлы. В данном варианте chmod установит разрешения 775 на все файлы включая файлы в подкаталогах начиная от текущего.

Биты SUID, SGID и Sticky

Unix отслеживает не символьные имена владельцев и групп, а их идентификаторы (UID - для пользователей и GID для групп). Эти идентификаторы хранятся в файлах /etc/passwd и /etc/group соответственно. Символьные эквиваленты идентификаторов используются только для удобства, например, при использовании команды ls, идентификаторы заменяются соответствующими символьными обозначениями.

1000 - идентификатор (UID) пользователя allexserv 0 - идентификатор (GID) основной группы (root) для пользователя allexserv

1000 - идентификатор (GID) дополнительной группы allexserv пользователя allexserv 8)

Если при создании пользователя основная группа не указана явно, то основной группой пользователя будет группа с тем же именем, что и имя пользователя. Например:

Что касается процессов, то с ними связано не два идентификатора, а 4-е: реальный и эффективный пользовательский (UID), а также реальный и эффективный групповой (GID). Реальные номера применяются для учета использования системных ресурсов, а эффективные для определения прав доступа к процессам. Как правило, реальные и эффективные идентификаторы совпадают. Владелец процесса может посылать ему сигналы, а также изменять приоритет.

Процесс не может явно изменить ни одного из своих четырех идентификаторов, но есть ситуации когда происходит косвенная установка новых эффективных идентификаторов процесса. Дело в том, что существуют два специальных бита: SUID (Set User ID - бит смены идентификатора пользователя) и SGID (Set Group ID - бит смены идентификатора группы). Когда пользователь или процесс запускает исполняемый файл с установленным одним из этих битов, файлу временно назначаются права его (файла) владельца или группы (в зависимости от того, какой бит задан). Таким образом, пользователь может даже запускать файлы от имени суперпользователя.

Восьмеричные значения для SUID и SGID - 4000 и 2000.

Вобщем, одним словом установка битов SUID или SGID позволит пользователям запускать исполняемые файлы от имени владельца (или группы) запускаемого файла. Например, как говорилось выше, команду chmod по умолчанию может запускать только root. Если мы установим SUID на исполняемый файл /bin/chmod, то обычный пользователь сможет использовать эту команду без использования sudo, так, что она будет выполнятся от имени пользователя root. В некоторых случаях очень удобное решение. Кстати по такому принципу работает команда passwd, c помощью которой пользователь может изменить свой пароль.

Возьмите на заметку! Если установить SGID для каталога, то все файлы созданные в нем при запуске будут принимать идентификатор группы каталога, а не группы владельца, который создал файл в этом каталоге. Аналогично SUID. Одним словом, если пользователь поместил исполняемый файл в такой каталог, запустив его, процесс запустится от имени владельца (группы) каталога, в котором лежит этот файл.

Однако, в системе FreeBSD, если скомпилировать ядро с поддержкой suiddir, а так же смонтировать раздел с этой опцией, то, все объекты создаваемые в каталоге где установлен SUID будут иметь владельца этого каталога (наследование). Реализация подобного в Linux возможна (?) на файловой системе GFS2. Данная функция считается уязвимостью.

Установить SUID и SGID можно командой chmod:

Данную задачу в Linux призвана решать стандартная связка программ GDB и gdbserver. Идея в том, что пишешь на компе программу (host в терминологии GDB), компилируешь её и заливаешь на целевое устройство (target). Далее запускаешь на целевом устройстве (target) отлаживаемый файл и gdbserver, а на хосте GDB и вперед.

Схему взаимодействия такой отладки кратко можно представить так:

image

Исполняемый файл — это та самая программа, которую мы хотим удаленно отлаживать. Для корректной работы, экземпляр программы должен находиться не только на целевом усройстве, но и на компе (host) с которого идет отладка.
GDB — программа, которая непосредственно выполняет процесс отладки. Обычно, входит в состав тулчейна GCC и находится там же где и компилятор.
gdbserver — ответная часть GDB, которая запускает исполняемый файл в режиме отладки. Поскольку gdbserver запускается на удаленной стороне (target), то он должен быть собран под целевое устройство, при помощи кросс-компилятора. Собственно, сборке gdbserver'а из исходников и посвящена в основном данная статья.

В моём распоряжении есть плата virt2real, а так же процессорный модуль на базе процессора от TI серии AM335x. Ниже будет показана последовательность действий на примере virt2real, однако, всё тоже самое мною было успешно (и что важно — аналогично) проделано с чипом AM335x.

Примечание: операционная система, установленная на host'e — Ubuntu.12.04.

Подготовка

Создаем в своей домашней директории папку gdb, в которой и будем производить все наши манипуляции. Внутри создаем подпапку downloads:


Скачиваем необходимые нам исходники и распаковываем их. Нам понадобится сам GDB, а так же библиотека termcap (её использует GDB).


Обычно собирают прямо в папке с исходниками, но мы так делать не будем, для того что бы оставить исходники нетронутыми. Это пригодится на случай, если у Вас есть не одна, а несколько разновидностей целевых платформ. Тогда одни и те же скаченные исходники можно будет использовать несколько раз.

Собираем библиотеку termcap

Соответственно, начинаем с библиотеки termcap, потому что она потребуется позднее при сборке самого gdbserver'a. Создаем папку builds, в которую будем собирать наши программы. Внутри создаем папку v2r, в неё поместим все результаты для платформы virt2real. Ну а там уже папку termcap для построения библиотеки termcap. Переходим в созданную директорию.


Указываем системе компилятор и ranlib которые будем использовать. В моем случае это:


Теперь конфигурируем. Потребуется указать 2 параметра: --host и --prefix.

  • Признаюсь, я так и не понял имеет ли значение, что указать в --host. У меня сложилось впечатление, что нет. В любом случае, я не сумел найти внятного объяснения, что именно нужно указывать в данном параметре, поэтому указал префикс компилятора. Т.е. мой компилятор называется arm-none-linux-gnueabi-gcc, поэтому в качестве --host я указал arm-none-linux-gnueabi.
  • В качестве параметра --prefix указываем папку, в которую мы хотим поместить результаты работа (конфигурирования), т.е. ту папку в которой мы сейчас и находимся.

Если все сделано правильно и прошло без ошибок, то в папке

/gdb/builds/v2r/termcap будет создан Makefile.

Рекомендую перестраховаться, открыть Makefile и поглядеть, что в качестве переменных CC и RANLIB указаны именно те, что мы указывали выше. Дело в том, что во время моих первых попыток собрать gdbserver, я на долго застрял из-за этого момента, ибо все вроде проходило нормально, но вот результирующий файл никак не хотел запускаться на целевой плате. Оказалось, что по неведомым мне причинам, в Makefile упорно использовался стандартный компилятор. Если обнаружите, что компилятор в Makefile указан не тот, можно просто заменить его руками (мне помогло). Хотя, когда я повторял всю процедуру перед написанием статьи, такой проблемы у меня не возникло.

Далее собираем библиотеку:

Собираем gdbserver

Создаем папку в которой будем собирать сервер и переходим в неё:


Указываем где взять библиотеку termcap:


Конфигурируем аналогично termcap. Тут важно отметить, что мы собираем gdbserver (а не GDB), поэтому файл configure указываем именно из папки /gdb-7.8/gdb/gdbserver:

Как ни старался я нигде не указывать абсолютных путей, что бы инструкцию можно было использовать вообще без корректировки под себя, у меня не получилось. Т.к. файл configure ругается на попытку указать в качестве --prefix путь, начинающийся с

. Поэтому, тут потребуется имя своего пользователя вписать.

Если все верно, будет создан Makefile. Далее стандартно:

Пробуем

Что бы протестировать процесс отладки создадим короткий Hello world и скомпилируем его под целевую платформу.

Исходный код файла hello.cpp:


Заливаем исполняемый файл hello и наш gdbserver на целевую плату.
Я заливаю в папку /usr/ используя SCP:


Теперь запускаем второй экземпляр терминала и подключаемся к целевой плате по ssh и переходим в папку /usr/:


Запускаем на целевой плате gdbserver, и с его помощью наш исполняемый (отлаживаемый) файл hello. Затем открываем дебажную сессию на понравившемся нам порту:


Возвращаемся на host и запускаем отлаживаемый файл hello с помощью GDB

Что бы иметь возможность не указывать всё время полный путь к GDB, можно прописать переменную окружения:

В ответ должны увидеть приглашение от GDB:


Подключаемся к удаленному gdbserver'у используя указанный выше порт:


Получаем ответ и приглашение для ввода следующей команды:


При этом удаленная сторона (gdbserver на target в лице virt2real) должна увидеть установку дебажной сессии:

  • для получения полного списка команд можно воспользоваться командой help, а так же почитать книгу, посвященную отладке с помощью GDB (ссылку смотри в конце статьи)
  • «ручная» отладка с помощью GDB дело весьма утомительное, так что рекомендую использовать для этих целей, например, Eclipse. К сожалению, описание подобной отладки в рамках данной статьи, увеличило бы её до неприличных размеров. В конце статьи указана ссылка на очень хорошее англоязычное описание данной темы.

Установка sysroot


А потенциально вызывать и другие неприятные проблемы отладки.
Для устранения проблемы GDB на host'е необходимо указать где взять эти самые библиотеки с помощью команды:


Если у Вас на host'е где-то завалялся образ линукса Вашго target'а, то необходимо указать путь до папки с библиотеками.
Или предварительно эти библиотеки выкачать на host:


Возвращаемся в папку с проектом, снова запускаем GDB и указываем путь до библиотек:


Посмотреть список используемых в текущий момент библиотек можно так:

Список используемой «литературы»

/gdb/builds/v2r/termcap
7) cd

/gdb/builds/v2r/termcap
8) export CC=/opt/virt2real-sdk/codesourcery/arm-2013.05/bin/arm-none-linux-gnueabi-gcc
9) export RANLIB=/opt/virt2real-sdk/codesourcery/arm-2013.05/bin/arm-none-linux-gnueabi-ranlib
10) ../../../downloads/termcap-1.3.1/configure --host=arm-none-linux-gnueabi --prefix=

/gdb/builds/v2r/termcap
11) make
12) make install
13) mkdir -p

/gdb/builds/v2r/gdbserver
14) cd

/gdb/builds/v2r/gdbserver
15) export LDFLAGS="-static -L

/gdb/builds/v2r/termcap/lib"
16) export CFLAGS="-g -O2 -I

edb is a cross platform AArch32/x86/x86-64 debugger. It was inspired by Ollydbg, but aims to function on AArch32, x86, and x86-64 as well as multiple OS's. Linux is the only officially supported platform at the moment, but FreeBSD, OpenBSD, OSX and Windows ports are underway with varying degrees of functionality.

Screenshot

edb is available under the GPL 2 license, see the COPYING for details.

NOTE: This README now only covers the most essential documentation, for more complete documentation see the wiki

When cloning the repo, please use git's --recursive flag to ensure that the sub-modules will be properly cloned and updated to the correct versions. Here is an example:

Compiling edb is generally quite simple. The latest release of edb currently depends on the following packages:

Dependency Version Required
GCC/Clang Supporting C++14
Qt >= 5.2
Boost (Headers Only) >= 1.35
Capstone >= 3.0
Graphviz >= 2.38.0 (Optional)

The development master branch will be increasing the minimum requirements to:

Dependency Version Required
GCC/Clang Supporting C++17
Qt >= 5.9
Capstone >= 3.0
Graphviz >= 2.38.0 (Optional)

Many distributions already have packages that satisify these. The wiki contains examples for some popular distributions:

Once you have the necessary dependencies installed, compilation is done with cmake :

If you plan to just run edb out of the build directory, it's as simple as this:

If you would like to properly install edb on the system for all users, it's only a little different:

Basic installation is simple, you may run

In which case the plugins will be installed in /usr/local/lib/edb and the binaries will be installed in /usr/local/bin/ .

Evan's debugger, edb or EDB-debugger is a great OllyDbg-like tool to play with executables, disassemble them, write exploits, etc. In this article I will show how to install it on Ubuntu Linux.

Point is it needs some pre-requisites, and the install guide for it doesn't tell how to install them making the process not-so-straightforward. Here we fix it.

Disclaimer On this web site you might read about or get access to various kinds of software and technology, including but not limited to libraries, operating systems, software for communications, mobile phones and tablets, Android software and Linux, even cars and motorcycles, security and penetration testing software, software used in security research and forensics, some samples of software which can be used (elsewhere) for malicious or illegal purposes. You will read about or be provided with the ways to change it, to operate it and to use it. You might find advice and recommendations, which are only an opinion, and not a legal advice or commercial recommendation..
Bear in mind, please, that everything you do, you do solely at your own risk and responsibility. In no way the author of this web site, information, graphics and other materials presented here or related to it can be made liable or anyhow else responsible for your own actions as well as actions of any third party and their direct or indirect results or consequences with or without the use of this information as well as the software, technology and systems mentioned and/or presented here, no matter if developed by the author or by any third party.
In no way it is guaranteed that you will meet any suitability for any particular purpose, safety, security, legality or even simply functioning of the software and systems described here. You have to make sure each time yourself, whether what you do, is really what you intend to do, and that you are ready to be yourself responsible for. All the recommendations and experiences described here are the opinions of corresponding authors and are to be taken with care and own full responsibility.
The software provided on or through this web site, linked to from this web site or anyhow else related to this web site is provided by the corresponding authors on their own terms. We provide all the software here as is without any guarantees to you. You are responsible for deciding whether it is suitable for you or not. You are also responsible for all direct or indirect consequences of using this software.
Other web sites linked to from the current one are out of the author's control, we can not guarantee anything about their content, its quality or even legality. We can not be liable for any use of the linked to web sites or of the information presented there.
We reasonably try to keep this website running smoothly and to deliver information to the best of our knowledge corresponding to the state of the art at the times when the information is composed, usually presented together with the information, and out of good intents. We can not however guarantee and can not be liable for this website being temporarily or permanently unavailable, presenting unreliable information or software, or any other similar or not malfunctioning or functioning not up to your expectations as well as any consequences which might result from this site's operation.

The edb debugger is a great simple tool helping you to debug binaries and build exploits.


Most probably, you know what it is for if you are reading this, otherwise look here to learn more about it.

Installing edb

First install the packages needed. It is the easiest and fastest way to get your libraries in tact.

On 32bit Ubuntu this worked for me:

sudo apt-get install git build-essential pkg-config
sudo apt-get install cmake
sudo apt-get install qt5-qmake qtcore5-dev libqt5svg5-dev libqt5xmlpatterns5-dev
sudo apt-get install libboost-dev

On 64bit Ubuntu:

Next, get capstone and build it:

Finally clone the edb-debugger:

cd edb-debugger
mkdir build
cd build
cmake ..
make
sudo make install

The 'cmake ..' command above might fail for a number of reasons.

The most popular reason is an absent library edb depends on. See the instructions above to install them on Ubuntu.

Another reason to fail might be connected to submodules. Check the .gitmodules file, there were two submodules at the time I wrote this manual. Make sure that both of the submodules are checked out right. In my case both submodules failed to check out.

Another submodule also failed to check out. I gave it a gentle kick with 'git submodule update --remote' and then the cmake command succeeded.

You should be good to go now!

Checkout PEDA if you want something console-based and maybe more powerful.

Читайте также: