我有以下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");
}
如果可以,请告诉我一个例子
答案 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语句。玩得开心。