Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
地址空间布局随机化与C语言结构_C_Memory_Struct_Buffer Overflow_Aslr - Fatal编程技术网

地址空间布局随机化与C语言结构

地址空间布局随机化与C语言结构,c,memory,struct,buffer-overflow,aslr,C,Memory,Struct,Buffer Overflow,Aslr,我有这样的结构: struct Books { char title[50]; char author[50]; }; 假设我知道,如果我将arg1传递给程序,在代码的某些部分,它会在$title+52方向上添加一些字符,因此作者值会被覆盖(缓冲区溢出) 现在我将ASLR添加到二进制文件中。通过这种方式,某些方向是随机的,因此我认为我之前描述的缓冲区溢出是不可能的 这是真的吗?或者,即使我添加了ASLR,结构成员的方向也在一起,缓冲区溢出是可能的?您提到的特定溢出仍然是可能的 除位字段

我有这样的结构:

struct Books {
 char  title[50];
 char  author[50];
};
假设我知道,如果我将
arg1
传递给程序,在代码的某些部分,它会在
$title+52
方向上添加一些字符,因此
作者
值会被覆盖(缓冲区溢出)

现在我将ASLR添加到二进制文件中。通过这种方式,某些方向是随机的,因此我认为我之前描述的缓冲区溢出是不可能的


这是真的吗?或者,即使我添加了ASLR,结构成员的方向也在一起,缓冲区溢出是可能的?

您提到的特定溢出仍然是可能的

除位字段外,结构的字段在内存中按顺序依次排列(中间可能有一些填充)。详细信息请参见本手册第6.7.2.1p15节:

在结构对象中,非位字段成员和 位字段所在的单元的地址增加 声明它们的顺序。指向结构的指针 对象(经过适当转换)指向其初始成员(或 如果该成员是位字段,则指向它所在的单元 ,反之亦然。其中可能有未命名的填充 结构对象,但不在其开头


因此,在这种情况下,
author
字段将始终跟随
title
字段,而不管
struct Books
类型的对象位于哪个特定地址。唯一可能的区别可能是填充量,但除非在结构中添加或删除字段,否则这可能不会改变。

ASLR不会影响编译时的内容。编译器在编译时选择结构的布局,并在生成的目标代码中进行硬编码


此外,C标准要求连续的结构成员按照它们在结构定义中出现的顺序排列在内存中(成员之间有未指定的填充,但这在编译时也是固定的)

我认为您误解了ASLR(地址空间布局随机化)的效果:ASLR随机安排进程的不同虚拟内存区域(可执行、堆栈、堆、数据、库等)在每次执行中的位置不同。它不会改变同一虚拟内存区域中元素的相对位置


以以下简单程序为例:

int main(void) {
    struct {
        char a[10];
        char b[10];
    } myvar;

    printf("a: %p\n", &myvar.a);
    printf("b: %p\n", &myvar.b);

    return 0;
}
以下是禁用ASLR的程序虚拟内存:

0x554000 0x555000 r-xp 1000 0/home/marco/test/test[可执行段]
0x55754000 0x5555755000 r--p 1000 0/home/marco/test/test[只读数据]
0x5555755000 0x5555756000 rw-p 1000 1000/home/marco/test/test[bss(全局变量)]

0x7FFFFDE000 0x7FFFFFF000 rw-p 21000[stack]ASLR随机化虚拟内存连续块的起始位置。您的变量仍将位于其中一个块内。ASLR不会神奇地解决缓冲区溢出问题。你可能会发现这篇文章很有帮助:请注意,“缓冲区溢出”是一个问题,而“缓冲区溢出攻击”是有区别的。ALSR不会将缓冲区溢出问题作为bug来处理。这只会使在攻击中更难有效地使用这样的bug。更具体地说,这使得使用这种bug来窃取信息或获取访问权限变得更加困难。这并不会使攻击更难使程序崩溃。嗨!谢谢你们,我会查一下:)谢谢你们的回答!C参考资料非常适合我所寻找的。:)你好谢谢你的解释,很清楚!现在一切都不清楚了。:)谢谢你的回答!:)