gpt4 book ai didi

c - 为什么添加 printf 行后没有触发 SIGFPE?

转载 作者:行者123 更新时间:2023-11-30 19:12:06 26 4
gpt4 key购买 nike

我正在玩一个简单的程序(源代码如下)。还有我的电脑配置:

Linux mymachine 3.13.0-49-generic#83-Ubuntu SMP 4 月 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已成功触发。但是,如果我取消注释检查“if”条件的参数中的单个 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

发生了什么?

最佳答案

因为现在你的源代码与实际解析的方式相比是错误缩进的。

if (argc != 3 || !atoi(argv[2]))
printf("!atoi(argv[2]) = %d\n", !atoi(argv[2]));
return 1;

考虑将这两个语句放在一个 block 中以避免这种情况。

关于c - 为什么添加 printf 行后没有触发 SIGFPE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37899860/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com