gcc在编译时是否对局部变量重新排序?

格汉

我目前正在(第二次)阅读“黑客:剥削的艺术”,偶然发现了一些东西。

该书提出了两种不同的方法来利用这两个类似的程序:auth_overflowauth_overflow2

在第一个中,有一个这样布置的密码检查功能

int check_authentication(char *password) {
    int auth_flag = 0;
    char password_buffer[16];

    strcpy(password_buffer, password);
    ...
}

输入超过16个ASCII字符会将auth_flag的值更改为大于0的值,从而绕过检查,如以下gdb输出所示:

gdb$ x/12x $esp
0xbffff400: 0xffffffff  0x0000002f  0xb7e0fd24  0x41414141
0xbffff410: 0x41414141  0x41414141  0x41414141  0x00000001
0xbffff420: 0x00000002  0xbffff4f4  0xbffff448  0x08048556

password_buffer @ 0xbffff40c
auth_flag @ 0xbffff41c

第二个程序将两个变量取反:

int check_authentication(char *password) {
    char password_buffer[16];
    int auth_flag = 0;

    strcpy(password_buffer, password);
    ...
}

然后作者提出,不可能溢出到auth_flag中,这是我真正相信的。然后,我继续使缓冲区溢出,令我惊讶的是,它仍然有效。可以在此gdb输出上看到,auth_flag变量仍位于缓冲区之后。

gdb$ x/12x $esp
0xbffff400: 0xffffffff  0x0000002f  0xb7e0fd24  0x41414141
0xbffff410: 0x41414141  0x41414141  0x41414141  0x00000001
0xbffff420: 0x00000002  0xbffff4f4  0xbffff448  0x08048556

password_buffer @ 0xbffff40c
auth_flag @ 0xbffff41c

我想知道gcc是否未出于对齐/优化目的对本地变量进行重新排序。

我尝试使用-O0标志进行编译,但结果是相同的。

你们中的一个人知道为什么会这样吗?

提前致谢。

chqrlie

编译器作者可以完全自由地为具有自动存储功能的局部变量实现任何分配方案。auth_flag可以password_buffer在堆栈之前或之后设置,可以在寄存器中,如果对代码进行适当的分析允许,则可以完全删除它。甚至可能没有堆栈...标准为您提供的唯一保证是:

strcpy(password_buffer, password);如果包含空终止符的源字符串比目标数组长,则调用未定义的行为password_buffer这种不确定的行为是否符合您的需求,完全超出了语言规范的范围。

实际上,某些实施者通过随机分配诸如张贴代码之类的行为来故意使黑客的任务复杂化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

转义对局部变量的引用

来自分类Dev

尝试对局部变量使用验证

来自分类Dev

对局部变量所做的更改是否链接到节点?

来自分类Dev

gcc:编译为BSS的线程局部变量

来自分类Dev

返回对局部变量的引用有问题吗?

来自分类Dev

无需简单转换即可返回对局部变量的引用

来自分类Dev

返回对局部变量的引用工作正常吗?

来自分类Dev

是否可以显式重新定义局部变量

来自分类Dev

是否需要局部变量?

来自分类Dev

递归调用Lotusscript函数时,局部变量是否独立?

来自分类Dev

分配对局部变量的引用,如果局部变量超出范围,会超出范围吗?

来自分类Dev

如果在编译期间不知道局部变量const的值,则可以在C ++中声明局部变量const的好处

来自分类Dev

在编辑全局变量时减少重新编译

来自分类Dev

使用线程安全针对局部变量和全局变量进行Java垃圾收集

来自分类Dev

编译堆栈机的局部变量

来自分类Dev

编译堆栈机的局部变量

来自分类Dev

如何在Python中对局部变量进行单元测试

来自分类Dev

如果通过lambda函数对象返回对局部变量的引用,会发生什么情况?

来自分类Dev

如何在Python中对局部变量进行单元测试

来自分类Dev

是否可以在编译时对变量进行“引用”?

来自分类Dev

是否在编译时确定const int定义的变量?

来自分类Dev

局部变量赋值是否需要引号?

来自分类Dev

能够在lambda中使用未捕获的局部变量的编译时特征有什么意义?

来自分类Dev

使用-fPIC编译的程序在GDB中跳过线程局部变量时崩溃

来自分类Dev

在while循环中使用最终局部变量时出现不同的编译错误

来自分类Dev

Rails 4:在编辑表单时显示上传的图像-获取未定义的局部变量或方法

来自分类Dev

C#编译器抱怨在没有局部变量之前滥用局部变量

来自分类Dev

重新声明全局变量vs局部变量

来自分类Dev

函数结束时是否会释放其局部变量?

Related 相关文章

  1. 1

    转义对局部变量的引用

  2. 2

    尝试对局部变量使用验证

  3. 3

    对局部变量所做的更改是否链接到节点?

  4. 4

    gcc:编译为BSS的线程局部变量

  5. 5

    返回对局部变量的引用有问题吗?

  6. 6

    无需简单转换即可返回对局部变量的引用

  7. 7

    返回对局部变量的引用工作正常吗?

  8. 8

    是否可以显式重新定义局部变量

  9. 9

    是否需要局部变量?

  10. 10

    递归调用Lotusscript函数时,局部变量是否独立?

  11. 11

    分配对局部变量的引用,如果局部变量超出范围,会超出范围吗?

  12. 12

    如果在编译期间不知道局部变量const的值,则可以在C ++中声明局部变量const的好处

  13. 13

    在编辑全局变量时减少重新编译

  14. 14

    使用线程安全针对局部变量和全局变量进行Java垃圾收集

  15. 15

    编译堆栈机的局部变量

  16. 16

    编译堆栈机的局部变量

  17. 17

    如何在Python中对局部变量进行单元测试

  18. 18

    如果通过lambda函数对象返回对局部变量的引用,会发生什么情况?

  19. 19

    如何在Python中对局部变量进行单元测试

  20. 20

    是否可以在编译时对变量进行“引用”?

  21. 21

    是否在编译时确定const int定义的变量?

  22. 22

    局部变量赋值是否需要引号?

  23. 23

    能够在lambda中使用未捕获的局部变量的编译时特征有什么意义?

  24. 24

    使用-fPIC编译的程序在GDB中跳过线程局部变量时崩溃

  25. 25

    在while循环中使用最终局部变量时出现不同的编译错误

  26. 26

    Rails 4:在编辑表单时显示上传的图像-获取未定义的局部变量或方法

  27. 27

    C#编译器抱怨在没有局部变量之前滥用局部变量

  28. 28

    重新声明全局变量vs局部变量

  29. 29

    函数结束时是否会释放其局部变量?

热门标签

归档