在AArch64架构下,栈保护机制中栈金丝雀是通过GCC编译器自动插入的。它存储在栈的相邻位置,并且与栈帧一起被推入栈中。以下是示例代码:
#include
#include
__attribute__((noinline))
void foo(int a, int b, int c, int d) {
char buff[256];
volatile long long canary;
printf("Canary before: %llx\n", canary);
// Read the canary value
asm("mrs %0, tpidr_el0" : "=r" (canary));
printf("Canary after: %llx\n", canary);
// Vulnerability
printf("Enter some text:\n");
gets(buff);
printf("You entered: %s\n", buff);
}
int main() {
foo(1, 2, 3, 4);
return 0;
}
在以上示例代码中,我们可以看到栈帧中存在一个名为canary
的变量,并且通过mrs
指令将栈金丝雀的值存储到该变量中。noinline
属性用于禁止函数被内联编译,确保栈帧结构不变。在函数返回前,可以再次使用mrs
指令读取栈金丝雀值并打印。
注意:示例代码存在漏洞,仅供学习和演示目的使用,不应在生产环境中运行。