#include <stdio.h>
#include <stdint.h>
int p()
{
char data[7]="Hello!\0";
uint64_t *ptr=((uint64_t)data + 0x18);
printf("%s",data);
(*ptr)-=10;
return 0x00;
}
int main(int argc,char **argv)
{
p();
}
答案 0 :(得分:2)
正如其他答案和评论中所提到的那样char data[7]="Hello!\0";
可能是一个问题,但我不认为这是问题的唯一来源。
我的猜测是:
uint64_t *ptr=((uint64_t)data + 0x18);
(*ptr)-=10;
通过执行此操作,您可能正在修改堆栈中的返回地址或执行类似的操作。
答案 1 :(得分:1)
你所拥有的是未定义的行为。
char data[7]="Hello!\0";
写入数组越界导致未定义的行为。这不是null终止字符串的正确方法。您可以选择以下选项之一。
将其更改为
char data[7]="Hello!";
你甚至可以拥有
char data[]="Hello!";
<强>编辑:强>
通过这样做
uint64_t *ptr=((uint64_t)data + 0x18);
您正在指向某个未由您分配的内存位置。稍后您尝试写入此位置
(*ptr)-=10;
因此,访问数组越界或写入某些未由您分配的内存会导致未定义的行为。您需要先修复它们