Я играю с простой программой (исходный код ниже). И моя конфигурация компьютера:Почему SIGFPE не запускается после добавления строки printf?
Linux моя_машина 3.13.0-49-родовое # 83-Ubuntu SMP Пт 10 апреля 20:11:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
GCC версии 4.8.4 (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.3)
#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 riggered. Однако, если я раскомментировать один 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
Что происходит?
Ooh ... слишком много программирования python в последнее время ... Спасибо! – drdot