Linux에서 독점 C++ 애플리케이션을 실행해야 하며 여기에 광고된 기능 이외의 기능이 포함되어 있는지 알아야 합니다.
애플리케이션에서 수행한 모든 API 호출을 나열하는 방법이 있습니까(Linux 시스템 호출을 사용하지 않고 표준 stdc++ 함수만 사용한다고 가정)?
비슷한질문나는 약 10년 전에 질문을 받았는데 그 대답은 전혀 만족스럽지 못했습니다. 완전히 자동화된 것이 필요합니다.
답변1
핵심요약: .hook를 사용하여 공유 객체 경계를 넘어 일반 함수 호출을 할 수 있습니다 bpftrace
. 그러나 특히 우리가 C++ 표준 라이브러리라고 생각하는 경우 이는 실제 C++ "표준 라이브러리"가 수행하는 작업의 작은 부분일 뿐입니다. 하지만 만약 당신이할 수 있다이러한 모든 함수 호출을 추적한다고 해서 보장되는 것은 아닙니다.
어떤 함수가 호출되는지 알 수 있는 일반적인 방법은 없습니다. 궁극적으로 표준 라이브러리의 어느 부분이 의도적으로 프로그램에 정적으로 연결되어 있는지 알 수 없으며 대부분은 인라인입니다. C++에서는 많은 표준 기능이 C++ 템플릿에 있으므로 libstdc++가 아닌 프로그램 컴파일 단위의 일부입니다. 더 나쁜 점은 공유 라이브러리에서 나온 함수만 사용하더라도 "함수 호출"은 전혀 "특별한" 것이 아니라 단지 함수일 뿐이라는 것입니다. 인수를 전달하고 주소로 점프하는 데 필요한 레지스터를 설정하기만 하면 됩니다. 공유 객체의 경우 주소는 다음과 같습니다.대개시작 시 표준 동적 링커를 사용하여 해결되었습니다.하지만 이것이 유일한 일이라는 보장은 전혀 없습니다.. 특히 프로그램이 런타임에 라이브러리(예: 플러그인을 구현하는 라이브러리, 스크립팅 언어 등)를 로드하는 경우 가져올 함수 테이블을 나열하는 것만 큼 간단하지 않습니다.
사용자 영역 프로그램을 추적하고 C++ 표준 라이브러리의 모든 함수에 대한 후크를 삽입하고 기록할 수 있습니다. bpftrace
여기서 선택하는 도구일 수 있습니다. bpftrace를 설치하고 일반적으로 /usr/share/bpftrace/tools에 있는 샘플 도구를 확인하세요 bashreadline.bt
. 구체적으로 다음과 같습니다.
#!/usr/bin/bpftrace
/*
* bashreadline Print entered bash commands from all running shells.
* For Linux, uses bpftrace and eBPF.
*
* This works by tracing the readline() function using a uretprobe (uprobes).
*
* USAGE: bashreadline.bt
*
* This is a bpftrace version of the bcc tool of the same name.
*
* Copyright 2018 Netflix, Inc.
* Licensed under the Apache License, Version 2.0 (the "License")
*
* 06-Sep-2018 Brendan Gregg Created this.
*/
BEGIN
{
printf("Tracing bash commands... Hit Ctrl-C to end.\n");
printf("%-9s %-6s %s\n", "TIME", "PID", "COMMAND");
}
uretprobe:/bin/bash:readline
{
time("%H:%M:%S ");
printf("%-6d %s\n", pid, str(retval));
}
uretprobe:executable name:function name
( objdump -T /lib64/libstdc++.so
또는 프로그램이 사용할 수 있다고 생각하는 라이브러리 에 대한 작은 awk, Python, PERL 또는 PL1 프로그램을 작성합니다. 계산할 수 있습니다.저것나가면 전화를 strace
찾으십시오 ). open
이 모든 것이 스크립팅에 적합합니다!
Linux에서 독점 C++ 애플리케이션을 실행해야 하며 여기에 광고된 기능 이외의 기능이 포함되어 있는지 알아야 합니다.
예, 이는 어떠한 보장도 제공하지 않습니다. 최상의 시나리오에서는 어떤 주소가 호출되고 있는지 확인할 수 있습니다. 프로그램이 외부 라이브러리가 올바른 상황에서 원하는 모든 작업을 수행할 수 있도록 ROP 트램펄린을 준비하는지 여부는 이를 수행할 수 있는 방법이 없습니다. 일반적으로 정상 작동 중에만 프로그램의 동작을 관찰할 수 있습니다. 하지만 읽지 않는 이상모두분해하는 과정에서 13일의 금요일에 실행될 때, UID=1234일 때, CPUID가 7로 끝날 때, 또는... AND: 모든 외부 라이브러리에 있습니다. 프로그램이 호출하는 것을 원하지 않는 불필요한 기능은 프로그래머가 프로그램 자체에 포함시킬 수 있습니다(함수를 복사하거나 정적 링크를 통해).
이것이 바로 운영 체제와 UNIXoid가 특히 운영 체제/사용자 도메인 경계에 걸쳐 권한을 분할하는 이유입니다. 특정 프로그램의 동작에 대한 보장은 없지만 Linux는 프로그램에 대한 액세스가 허용되지 않음을 보장할 수 있습니다(충분한 확실성). 파일에 접근할 수 없습니다. 프로그램 자체에 접근을 허용하는 것은 불가능합니다.