2014-11-02 83 views
0

我有以下C程序,我想通过更改内存地址来更改变量secret。你能不能给我一个例子,我应该给以下两个输入来完成这个。任何帮助将大大appriciated更改存储在变量中的内存地址C

#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"); 
} 

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

+0

this line:scanf(“%p”,(void **)&value);将值的地址作为void **进行投射。 scanf只关心地址和格式转换,所以(无效**)是无用的 – user3629249 2014-11-02 11:20:43

+0

写一些用户提供的地址(一些随机地址)是一个很好的方式来崩溃程序,可能是一个seg故障。 – user3629249 2014-11-02 11:22:13

回答

0

只需将printf("Address of secret is: %p", &secret);加上其他任何东西,然后当您运行该程序时,将第一个输入的实际地址打印出来(&秘密),第二个输入为程序“1337beef”。例如,在我的机器上,它声明可变机密位于0x804a02c,因此对于第一个输入,我给了它“804a02c”,对于第二个“1337beef”,因此它输入了if语句。玩的开心。

1

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

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