私は単純なプログラム(以下のソースコード)で遊んでいます。そして、私のコンピュータの構成:printf行を追加した後にSIGFPEがトリガされないのはなぜですか?
のLinux MYMACHINE 3.13.0-49ジェネリック#83-UbuntuのSMP金4月10日午前20時11分33秒UTC 2015 x86_64のx86_64でのx86_64のGNU/Linuxの
gccのバージョン4.8.4(Ubuntuの〜14.04.3 4.8.4-2ubuntu1)
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void catcher(int a){
setresuid(geteuid(),geteuid(),geteuid());
printf("WIN!\n");
system("/bin/sh");
exit(0);
}
int main(int argc, char **argv){
puts("source code is available in level02.c\n");
if (argc != 3 || !atoi(argv[2]))
//printf("!atoi(argv[2]) = %d\n", !atoi(argv[2]));
return 1;
signal(SIGFPE, catcher);
printf("end\n");
return abs(atoi(argv[1]))/atoi(argv[2]);
}
私はこの方法で実行可能ファイルを呼び出すことにより、このプログラムにSIGFPEをトリガーするつもり:
$./a.out -2147483648 -1
source code is available in level02.c
end
WIN!
あなたが見ることができるように、SIGFPEが正常ですtうんざりする。しかし、私は条件「場合」をチェック引数に単一のprintf行のコメントを解除した場合:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void catcher(int a){
setresuid(geteuid(),geteuid(),geteuid());
printf("WIN!\n");
system("/bin/sh");
exit(0);
}
int main(int argc, char **argv){
puts("source code is available in level02.c\n");
if (argc != 3 || !atoi(argv[2]))
printf("!atoi(argv[2]) = %d\n", !atoi(argv[2]));
return 1;
signal(SIGFPE, catcher);
printf("end\n");
return abs(atoi(argv[1]))/atoi(argv[2]);
}
そして、私は、プログラムを再コンパイルし、同じ方法を使ってSIGFPEをトリガしてみてください。私はこれだけを得る:
source code is available in level02.c
何が起こっているか?
最近、あまりにも多くのPythonプログラミング...ありがとう! – drdot