溢出以更改C中结构中的下一个元素
我有这样的结构设置:溢出以更改C中结构中的下一个元素,c,struct,buffer-overflow,C,Struct,Buffer Overflow,我有这样的结构设置: typedef struct _aStruct { char aChar[32]; int target; } 什么值会使此溢出aChar,以更改“目标” memset(aStruct.aChar,0,32) 很抱歉,如果这个问题有根本性的缺陷,我是新手。我认为问题出在语法上,也许你做了一个指针,而不是像指针一样使用它 您的typedef没有名称,您必须将其设置为如下所示: typedef struct _aStruct { char aChar[32];
typedef struct _aStruct
{
char aChar[32];
int target;
}
什么值会使此溢出aChar
,以更改“目标”
memset(aStruct.aChar,0,32)
很抱歉,如果这个问题有根本性的缺陷,我是新手。我认为问题出在语法上,也许你做了一个指针,而不是像指针一样使用它 您的typedef没有名称,您必须将其设置为如下所示:
typedef struct _aStruct
{
char aChar[32];
int target;
} typedef_name;
typedef_name *structVar;
必须声明如下所示的变量:
typedef_name structVar;
memset(structVar.aChar, 0, 32);
memset(structVar->aChar, 0, 32);
然后像这样使用它:
typedef_name structVar;
memset(structVar.aChar, 0, 32);
memset(structVar->aChar, 0, 32);
您还可以将其声明为指针,如下所示:
typedef struct _aStruct
{
char aChar[32];
int target;
} typedef_name;
typedef_name *structVar;
然后像这样使用它:
typedef_name structVar;
memset(structVar.aChar, 0, 32);
memset(structVar->aChar, 0, 32);
一个大问题是
structs
上的填充是由实现定义的。在一个编译器上工作的内容将导致另一个编译器上的错误或内存损坏。可以说,32或更小的值永远不会溢出,32+sizeof(int)
或更小的值不会损坏其他内存,即使它确实溢出。用更大的数字33替换32。。36再大一点,你就会破坏结构。谢谢你的帮助,让我们假设代码可以工作。我想知道的是,在编译时,是否有一个输入到memset的值会改变其他数据?如果您尝试写入的内存没有分配(或不静态存在),您将有一个分段错误。这取决于你想要你的memset做什么。在这里,你只需将32倍的“0”写入你的32大小的数组,所以它应该可以工作。它不会替换或改变你的结构中的其他东西。这不是工会。