Canary保护

Canary Canary(金丝雀) 保护原理 Canary 的意思是金丝雀,来源于英国矿井工人用来探查井下气体是否有毒的金丝雀笼子。工人们每次下井都会带上一只金丝雀。如果井下的气体有毒,金丝雀由于对毒性敏感就会停止鸣叫甚至死亡,从而使工人们得到预警。 Canary保护的原理是在栈上 rbp 附近放置一个随机数,等到函数执行结束,就会 检测 该位置存放的随机数是否被改动(覆盖),如果是说明发生了栈溢出,可能导致rbp,ret address 被修改导致异常行为,会中止程序的运行。 High Address | | +-----------------+ | args | +-----------------+ | return address | +-----------------+ rbp => | old ebp | +-----------------+ rbp-8 => | canary value | +-----------------+ | local variables | Low Address | | 具体细节 如何开启/关闭canary保护: gcc -o test test.c // 默认情况下,不开启Canary保护 gcc -fno-stack-protector -o test test.c //禁用栈保护 gcc -fstack-protector -o test test.c //启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码 gcc -fstack-protector-all -o test test.c //启用堆栈保护,为所有函数插入保护代码 -fno-stack-protector /-fstack-protector / -fstack-protector-all (关闭 / 开启 / 全开启) 编译一个例子来看看: ...

January 19, 2025 · 2 min · 347 words · Chenjx12

NX(DEP)保护

NX(DEP) 全名为No-eXecute(不可执行) 开启/关闭方法: gcc -o test test.c // 默认情况下,开启NX保护 gcc -z execstack -o test1 test.c // 禁用NX保护 gcc -z noexecstack -o test2 test.c // 开启NX保护 -z execstack / -z noexecstack (关闭 / 开启) 看看例子 现在用gdb调试一下看看 这个是默认开启了NX保护的,可以通过 vmmap 指令,看到栈的部分权限是没有x(execute)执行权限的 而这里呢,test1是禁用了NX保护的,栈区的权限多了一个X 具体细节 ​ 了解**冯·诺依曼结构的师傅应该知道,它将程序指令存储器和数据存储器合并在一起,使数据和程序以同等地位存放在内存当中**。 ​ NX是**数据与程序的分水岭,栈溢出核心思想是通过局部变量覆盖函数返回地址来修改EIP和注入 Shellcode,在函数返回时跳到Shellcode去执行。要防止这种攻击,最有效的办法就是让攻击者注入的Shellcode无法执行,这就是数据执行保护(Data Execution Prevention, DEP)安全机制的初衷。NX策略是使栈区域的代码无法执行**。 ​ 该保护机制用于防范:栈溢出 + shellcode ​ 正常在栈溢出时通过跳转指令跳转至shellcode,但是NX开启后CPU会对数据区域进行检查,当发现正常程序不执行,并跳转至其他地址后会抛出异常,接下来不会继续执行shellcode,而是去转入异常处理,处理后会禁止shellcode继续执行。

January 9, 2025 · 1 min · 54 words · Chenjx12