gpt4 book ai didi

c - 在 Fedora 21 中启用 Stack Smashing

转载 作者:行者123 更新时间:2023-11-30 17:14:50 25 4
gpt4 key购买 nike

我正在尝试编写一个 C 程序来演示写入堆栈的不同区域以在运行时更改程序的执行。

我有这个程序:

#include<stdio.h>

int* useless_function (int x) {
int* somewhere_in_the_stack = &x;
int* another_place = &x + 5;
return (int*)((long int)(*another_place)) - 3;
}
int main () {
int step = 3;
int* q = useless_function(50);
printf("%d %d\n",&step,q);
//printf("%d %d\n",&step,*q);
}

试图做到这一点。基本上,unusable_function 返回堆栈上主函数中局部变量“step”的地址。当我在我的机器上编译并执行程序时, printf 为“step”和“q”打印出相同的确切内存地址,但是在注释掉的行中,当我尝试遵循“q”时,我遇到了段错误。但是,我可以在没有段错误的情况下执行 *(&step)。

我尝试使用此选项“-fno-stack-protector”进行编译,但它不起作用。

最佳答案

这是完全错误的,但可能适用于 32 位平台。

#include<stdio.h>

int* useless_function (int x) {
int* somewhere_in_the_stack = &x;
int* another_place = &x + 5;

指向 int 的指针。

  return (int*)((long int)(*another_place)) - 3;

因此 (*another_place) 是一个 int。然后你将它转换为 long int 。如果地址不适合 int(通常不适合),您就会丢失其中的一部分。然后对结果进行符号扩展。你会看到的......

}
int main () {
int step = 3;
int* q = useless_function(50);
printf("%d %d\n",&step,q);

如果您使用正确的格式说明符 (%p),您将会看到截断。有趣的是,即使没有 -Wall,gcc 也会警告这个问题,所以我也很困惑为什么你在解决报告的问题之前问“发生了什么”这个问题。

最后,一个有趣的事实是 printf("%p\n",pointer);除非指针的类型为 char * 或 void *,否则会触发未定义的行为。

关于c - 在 Fedora 21 中启用 Stack Smashing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30159506/

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