
이런 장난감 C++ 프로그램이 있습니다
#include <iostream>
int main() {
int n{};
std::cin >> n; // waits for input
std::cout << n << std::endl;
}
주석이 달린 줄을 실행하는 동안 일시 중지되어 사용자 입력을 기다리고 디버거를 연결하는 데 필요한 모든 시간을 제공합니다.
한 터미널에서 이 프로그램을 실행한 다음 다른 터미널에 입력합니다.
gdb -p $(pidof that-executable)
목적은 위의 소스 코드에서 컴파일된 실행 파일에 디버거를 연결하는 것입니다.
그러나 시도하면 다음 오류가 발생합니다.
GNU gdb (GDB) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
Attaching to process 1086551
ptrace: Operation not permitted.
답변1
gdb
gdb
이는 공격자가 수행할 수 있는 작업(사용자 환경의 피어 프로세스에서 개인 키를 훔치거나 변경하는 등)을 고려할 때 보안상의 이유로 차단될 수 있습니다. 결과적으로 최신 운영 체제에서는 gdb
액세스할 수 있는 항목이 제한되는 경우가 많습니다.
가장 좋은 접근 방식은 gdb
프로세스에 연결하는 것보다 아래에서 프로그램을 실행하는 것입니다. 이는 설정이 까다로울 수 있지만 일반적으로 기본적으로 허용됩니다.
그렇지 않으면 구성 값( /proc/sys/kernel/yama/ptrace_scope
예:리눅스, 또는 OpenBSD의 sysctl)을 사용하여 액세스가 허용되는 항목을 kern.global_ptrace
조정합니다 . 또는 다음 으로 gdb
실행 하면 다른 문제가 발생할 수 있습니다. 또는 Linux의 컨테이너에 먼저 이 기능을 부여해야 할 수도 있습니다 . 호출된 프로세스는 추적하기 어려울 수 있습니다.gdb
root
SYS_PTRACE
prctl(PR_SET_DUMPABLE...)
Linux에서는 selinux 또는 기타 보안 프레임워크로 인해 작업이 실패할 수도 있습니다. 느슨하게 설정해 보세요.
답변2
두 가지 가능한 솔루션(임시 솔루션과 영구 솔루션)이 설명되어 있습니다.다음은 AskUbuntu에 대한 유사한(동일하지는 않더라도) 질문에 대한 답변입니다..
이 부분임시 기능을 사용하여 프로그램 실행존재하다ArchLinux 위키대체 솔루션이 제공됩니다.
첫 번째 링크의 임시 솔루션과 두 번째 링크의 솔루션을 테스트했습니다. 그들은 모두 작동합니다.
올바른 접근 방식이 무엇인지 확신할 수 없기 때문에 저도 마찬가지입니다.ArchLinux 포럼에 문의하세요.