更改存储在C中的变量中的内存地址

时间:2014-11-02 04:12:35

标签: c memory-management buffer

我有以下C程序,我想通过更改内存地址来更改变量secret。能否请您给我一个例子,我应该为以下两个输入做些什么来完成这个。任何帮助都会非常适合

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

unsigned secret = 0xdeadbeef;

int main(int argc, char **argv){
    unsigned *ptr;
    unsigned value;


    printf("Welcome! I will grant you one arbitrary write!\n");
    printf("Where do you want to write to? ");
    scanf("%p", &ptr);
    printf("Okay! What do you want to write there? ");
    scanf("%p", (void **)&value);

    printf("Writing %p to %p...\n", (void *)value, (void *)ptr);
    *ptr = value;
    printf("Value written!\n");

    if (secret == 0x1337beef){
        printf("Woah! You changed my secret!\n");
        exit(0);
    }

    printf("My secret is still safe! Sorry.\n");
}

如果可以,请告诉我一个例子

2 个答案:

答案 0 :(得分:1)

制作一个打印secret地址的变体。编译并运行变体程序。

编辑:地址和分配的详细信息是特定于实现的。所以没有办法从C标准中发现这个数字。 printf("%p",...返回的值(受scanf("%p",...影响)取决于特定的操作系统和编译器的特定设置。例如,我的Windows机器上有两个gcc版本,一个在Cygwin下,一个在MinGW下。如果printf("%p",some_static_variable)在两种环境中都打印了相同的值,那将是非常令人惊讶的。

答案 1 :(得分:0)

只需在其他任何内容上添加printf("Address of secret is: %p", &secret);,然后在运行程序时,为第一个输入提供打印出来的实际地址(&amp; secret),对于第二个输入,给出程序&#34; 1337beef&#34 ;.例如,在我的机器上,它声明变量secret位于0x804a02c,所以对于第一个输入我给它&#34; 804a02c&#34;对于第二个&#34; 1337beef&#34;所以它进入了if语句。玩得开心。