에코로 인한 분할 오류

에코로 인한 분할 오류

Smokeping의 DNS 감지를 테스트하기 위해 에코 프로그램을 사용하고 있습니다.문서, 그러나 저는 Smokeping을 통해 명령을 실행할 때 분할 오류가 발생했습니다. Smokeping이 실행하려고 했던 명령을 잡고 systemctl status smokeping.service일반 사용자 및 루트로 실행해 보았습니다.

echoping -w 1 -p 6 -t 1 -6 -m /usr/lib/echoping/dns.so -n 20 facebook.com -t AAAA --tcp facebook.com

종료되는 이유는 다음과 같습니다.Segmentation fault (core dumped)

strace출력은 다음과 같습니다여기.

내 테스트 상자의 배포판은 Arch Linux 4.20 커널입니다. 나는 또한 이것을 LTS 커널 4.19에서 테스트했지만 성공하지 못했습니다.

어떤 아이디어가 있나요?

편집하다:

Smokeping이 실행하려고 하는 실제 명령은 다음과 같습니다.

echoping -w 1 -P 0xa0 -p 6 -t 1 -6 -m /usr/lib/echoping/dns.so -n 20 facebook.com -t AAAA --tcp facebook.com

(게시하기 전에 플래그를 생략하려고 해서 놓쳤는 -P 0xa0데 최근에 실행한 명령 이전에 복사했어야 했는데...)

고쳐 쓰다:

코어 덤프에서 역추적:

$ gdb /usr/bin/echoping core.27236 
GNU gdb (GDB) 8.2.1
...
Reading symbols from /usr/bin/echoping...(no debugging symbols found)...done.
[New LWP 27236]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
Core was generated by `echoping -w 1 -P 0xa0 -p 6 -t 1 -6 -m /usr/lib/echoping/dns.so -n 20 facebook.c'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007f73c938246a in init () from /usr/lib/echoping/dns.so

(gdb) backtrace full
#0  0x00007f73c938246a in init () from /usr/lib/echoping/dns.so
No symbol table info available.
#1  0x0000564855557d58 in main ()
No symbol table info available.

답변1

이것은 단지 Python의 버그 echoping(1)이므로 보고해야 합니다(이전 버전에서 수정되지 않았는지 확인한 후).


util.c소스 코드 파일 에는 다음과 같은 작은 cx-er가 있습니다.

char           *
to_upper(char *input)
{
        int             c;
        char           *result;
        result = (char *) malloc(strlen(input));
        for (c = 0; c < strlen(input); c++)
                result[c] = toupper((int)input[c]);
        result[strlen(input)] = '\0';
        return result;
}

result[strlen(input)]할당된 버퍼의 길이를 초과하여 1바이트가 어떻게 기록되는지 참고하세요 malloc().

하지만 그게 전부는 아닙니다. 올바른 프로토타입(x86-64에서 64비트 포인터를 반환)을 선언하는 대신 to_upper()컴파일러가 32비트 int를 반환한다고 가정하고강제 시전반환 값은 다음 (char*)과 같습니다 plugins/dns/dns.c.

char           *
init(const int argc, const char **argv)
{
   ...
                upper_type_name = (char *) to_upper(type_name);

후자가 죽였어, 내 생각엔 이건 아닌 것 같아한 번x86-64에서 실행하는 경우 유일한 희망은 시스템을 다중 아키텍처로 구성하고 echoping데비안의 예(테스트되지 않음)로 설치하는 것입니다.

apt-get remove echoping
dpkg --add-architecture i386
apt-get update
apt-get install echoping:i386

apt-get source echoping[데비안 9의 echoping-6.0.2 소스 코드를 사용했습니다. ]

관련 정보