二进制安全吧 关注:11贴子:86
  • 13回复贴,共1

GCC 堆栈保护技术

只看楼主收藏回复



IP属地:湖北来自Android客户端1楼2018-10-20 11:35回复
    Linux 中有各种各样的安全防护ASLR 是由内核直接提供的,通过系统配置文件控制。NX,Canary,PIE,RELRO 要在编译时根据各项参数开启或关闭。未指定参数时,使用默认设置。


    IP属地:湖北来自Android客户端2楼2018-10-20 11:36
    回复
      启用 CANARY 后,函数开始执行的时候会先往栈里插入 canary 信息,当函数返回时验证插入的 canary 是否被修改,如果是,说明发生了栈溢出,程序停止运行。


      IP属地:湖北来自Android客户端3楼2018-10-20 11:37
      回复
        比如,
        #include <stdio.h>
        void main(int argc, char **argv) {
        char buf[10];
        scanf("%s", buf);
        ]


        IP属地:湖北来自Android客户端4楼2018-10-20 11:38
        回复
          复制粘贴太麻烦了,不关是资料还是代码,还是自己以前总结的,以后有时间截图给你们看看


          IP属地:湖北来自Android客户端5楼2018-10-20 11:39
          回复
            开启 CANARY,提示检测到栈溢出和段错误,而关闭的时候,只有提示段错误。反汇编代码上的差异我就不贴了,就想混个吧主玩玩


            IP属地:湖北来自Android客户端6楼2018-10-20 11:41
            回复
              FORTIFY 的选项 -D 往往和优化 -O 选项一起使用,检测缓冲区溢出的问题。


              IP属地:湖北来自Android客户端7楼2018-10-20 11:42
              回复
                checksec 后 FORTIFY 为 No。当
                配合 -D_FORTIFY_SOURCE=2 (也可以 =1 )使用时,提示存在溢出问题,checksec 后 FORTIFY 为 Yes。


                IP属地:湖北来自Android客户端8楼2018-10-20 11:43
                回复
                  (nx)No-eXecute,表示不可执行,原理就是将数据所在的内存页标识为不可执行,程序产生溢出转入执行 shellcode ,CPU 抛出异常。
                  Linux 中,装载器将程序装载进内存空间后,将程序的 .text 段标记为可执行,而其余的数据段(.data、.bss 等)以及栈、堆均为不可执行。因此,传统利用方式中通过修改 GOT 来执行 shellcode 的方式不可行。
                  不过这种保护并不能阻止攻击者通过代码重用来攻击(ret2libc)。


                  IP属地:湖北来自Android客户端9楼2018-10-20 11:45
                  回复
                    PIE要配合 ASLR 来使用,以达到可执行文件的加载时地址随机化。PIE 是编译时随机化,由编译器完成;ASLR
                    是加载时随机化,由操作系统完成。ASLR 将程序运行时的堆栈以及共享库的加载地址随机化,而 PIE 在编译时将程序编译为位置无关、即程序运行时各个段加载的虚拟地址在装载时确定。开启 PIE 时,编译生成的是动态库文件,关闭 PIE 后生成可执行文件


                    IP属地:湖北来自Android客户端10楼2018-10-20 11:47
                    回复
                      有时间给几个实例出来,我现在就想水个帖,申请一下吧主过过瘾


                      IP属地:湖北来自Android客户端11楼2018-10-20 11:47
                      回复
                        最后再说一下ASLR,该技术虽然不是由 GCC 编译时提供的,但对 PIE 还是有影响。就是将程序的内存布局随机化,让攻击者不能得到数据区的地址来构造 payload。程序的堆栈分配与共享库的装载都是在运行时进行,系统在程序每次执行时,随机地分配程序堆栈的地址以及共享库装载的地址。使攻击者无法预测自己写入的数据区的虚拟地址。
                        针对这个保护机制的攻击,一般是通过信息泄漏来实现。同一模块中的所有代码和数据的相对偏移是固定的,泄漏出某个模块中的任一代码指针或数据指针,就可通过计算得到此模块中任意代码或数据的地址。


                        IP属地:湖北来自Android客户端12楼2018-10-20 11:50
                        回复
                          大哥


                          来自Android客户端13楼2019-10-09 11:20
                          回复
                            qq多少?


                            来自Android客户端14楼2019-10-09 11:21
                            回复