栈溢出基础知识有哪些?

2026-05-25 06:431阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1469个文字,预计阅读时间需要6分钟。

栈溢出基础知识有哪些?

栈溢出基础知识+之前已介绍了C语言函数调用栈,本文将正式介绍栈溢出攻击。

函数调用结束时,将发生函数跳转。通过读取栈上的信息(返回地址),可以跳转到任意指令执行。

栈溢出基础

之前已经介绍了C语言函数调用栈,本文将正式介绍栈溢出攻击。

当函数调用结束时,将发生函数跳转,通过读取存放在栈上的信息(返回地址),跳转执行下一条指令。通过栈溢出的方式,可以将返回地址覆盖为攻击指令的地址,这样函数调用结束后,将跳转到攻击指令继续执行。

Stack Canary

canary是可以比矿工更早发现煤气泄露的金丝雀,有预警作用。canary是栈上的一个随机数,在程序启动时生成并保存在比函数返回地址更低的位置。由于栈溢出是从低地址向高地址覆盖,所以要想覆盖到返回地址,则必须先覆盖canary。

看一个存在栈溢出可能性的C语言代码canary.c:

// canary.c # include <stdio.h> int main(void) { char buf[10]; scanf("%s", buf); return 0; }

将canary.c正常编译成64位程序canary64,用checksec检查会发现已经开启了栈保护(Stack: Canary found),这时,如果出现栈溢出,则程序会抛出错误stack smashing detected。如果不想启用栈溢出保护,可以在编译时加上选项-fno-stack-protector。我们用gdb查看一下canary64的部分反汇编代码。

阅读全文

本文共计1469个文字,预计阅读时间需要6分钟。

栈溢出基础知识有哪些?

栈溢出基础知识+之前已介绍了C语言函数调用栈,本文将正式介绍栈溢出攻击。

函数调用结束时,将发生函数跳转。通过读取栈上的信息(返回地址),可以跳转到任意指令执行。

栈溢出基础

之前已经介绍了C语言函数调用栈,本文将正式介绍栈溢出攻击。

当函数调用结束时,将发生函数跳转,通过读取存放在栈上的信息(返回地址),跳转执行下一条指令。通过栈溢出的方式,可以将返回地址覆盖为攻击指令的地址,这样函数调用结束后,将跳转到攻击指令继续执行。

Stack Canary

canary是可以比矿工更早发现煤气泄露的金丝雀,有预警作用。canary是栈上的一个随机数,在程序启动时生成并保存在比函数返回地址更低的位置。由于栈溢出是从低地址向高地址覆盖,所以要想覆盖到返回地址,则必须先覆盖canary。

看一个存在栈溢出可能性的C语言代码canary.c:

// canary.c # include <stdio.h> int main(void) { char buf[10]; scanf("%s", buf); return 0; }

将canary.c正常编译成64位程序canary64,用checksec检查会发现已经开启了栈保护(Stack: Canary found),这时,如果出现栈溢出,则程序会抛出错误stack smashing detected。如果不想启用栈溢出保护,可以在编译时加上选项-fno-stack-protector。我们用gdb查看一下canary64的部分反汇编代码。

阅读全文