エコーによる分割エラー

エコーによる分割エラー

SmokepingのDNS検出をテストするためにエコープログラムを使用しています。文書しかし、私はSmokeping経由でコマンドを実行すると分割エラーが発生しました。 Smokepingが実行しようとしたコマンドをキャッチし、通常のsystemctl status smokeping.serviceユーザーとrootとして実行してみました。

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で実行している場合の唯一の希望は、システムを複数のアーキテクチャで構成し、echopingDebianの例(テストされていない)としてインストールすることです。

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

apt-get source echoping[Debian 9のechoping-6.0.2ソースコードを使用しました。 ]

関連情報