Я столкнулся с той же проблемой, и в начале я думал так же, как и выше, что, возможно, GDB игнорирует возможности исполняемого файла по соображениям безопасности. Однако, читая исходный код и даже используя отладку eclipse для самого gdb при отладке моей программы ext2fs-prog, которая открывает /dev/sda1
, я понимаю, что:
- GDB не является особенным, как любая другая программа. (Точно так же, как в матрице, даже сами агенты подчиняются одному и тому же физическому закону, гравитации и т. Д., За исключением того, что все они хранители дверей.)
- GDB - это не родительский процесс отлаживаемого исполняемого файла, а дедушка.
- Истинный родительский процесс отлаживаемого исполняемого файла - это "оболочка", т.е. в моем случае
/bin/bash
.
Итак, решение очень простое, кроме добавления cap_net_admin,cap_net_raw+eip
в gdb, вы также применили это к своей оболочке. т.е. setcap cap_net_admin,cap_net_raw+eip /bin/bash
Причина, по которой вы также должны сделать это с GDB, заключается в том, что GDB является родительским процессом /bin/bash
до создания отлаженного процесса.
Истинная исполняемая командная строка внутри GDB выглядит следующим образом:
/bin/bash exec /my/executable/program/path
И это параметр для vfork внутри GDB.