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