我正在尝试使用缓冲区溢出修改结构中的整数,但是我无法弄清楚该整数以什么格式存储。
我做了一些测试代码:
struct {
char beginningWord[3];
int32_t middleInt;
char endingWord[3];
} testStruct;
testStruct.middleInt = 5;
strcpy(testStruct.endingWord, "123");
strcpy(testStruct.beginningWord, "AAAA0000FFF");
这会将endingWord从“ 123”更改为“ FFF”,将整数从5更改为808464432。例如,我应该使用什么覆盖整数存储插槽并将其更改为9?
答案 0 :(得分:1)
strcpy
无法可靠地复制右宽度的9(32位)。看起来像是十六进制:
00000009
通常,它将以这种方式存储在内存中(称为Little Endian)
09 00 00 00
这不是由字符“ 0”和“ 9”组成的字符串,它是四个字节,值分别为9和0。
09
和第一个00
可以被strcpy
复制,但是strcpy
停止,因为00
表示字符串的结尾。因此,不会写入整数的两个字节(和endingWord
)并保留其先前的值。如果高字节开始不为零,则结果值将不是9。 memcpy
可以可靠地复制此类数据,包括“非最终”零。
作为字符,09
在ASCII编码中将解释为(或写为)\t
(制表符)。