51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

缓冲区溢出漏洞是经典的漏洞类型,请描述在Linux环境下利用栈溢出漏洞执行任意代码的完整流程,并举例说明如何利用该漏洞在360安全卫士的某个本地模块中获取shell权限。

360助理安全研究员(漏洞挖掘与利用)难度:困难

答案

1) 【一句话结论】在Linux环境下,栈溢出漏洞通过覆盖函数调用后的返回地址,使程序跳转到我们构造的恶意代码(如shellcode),从而执行任意指令,获取系统权限。

2) 【原理/概念讲解】老师解释栈帧结构。函数调用时,栈会向下增长,保存返回地址(函数返回后跳转的地址)、局部变量、函数参数等。缓冲区溢出是指向缓冲区写入超过其容量的数据,这些多余的数据会覆盖栈上的返回地址,导致函数返回时跳转到错误的地址。比如,函数vuln中有一个缓冲区buf,当输入字符串长度超过buf大小时,strcpy会将输入全部复制到buf,并覆盖栈上的返回地址。此时,程序执行完vuln后,会从错误的地址跳转,执行我们构造的代码。类比:就像给一个杯子倒水,杯子满了还倒,水就会溢出,覆盖旁边的地址标签(返回地址),导致程序“走错路”,跳转到我们指定的位置。

3) 【对比与适用场景】

漏洞类型定义核心原理利用方式注意点
栈溢出函数调用时,缓冲区溢出覆盖返回地址覆盖栈上的返回地址控制返回地址跳转需计算偏移量,处理栈保护
堆溢出操作堆内存时,溢出覆盖堆结构覆盖堆控制块控制堆地址跳转需计算堆偏移量,处理内存保护
格式化字符串使用未初始化的格式化字符串函数读取栈/堆内存控制输出位置需分析格式化字符串格式

栈溢出是经典的代码执行漏洞,适用于存在缓冲区未检查边界的函数(如strcpy、gets、sprintf等),通过修改返回地址实现代码执行。

4) 【示例】
以一个简单的C程序为例,展示栈溢出漏洞及利用:

#include <stdio.h>
#include <string.h>

void vulnerable_function(char *input) {
    char buffer[64];
    strcpy(buffer, input); // 缺少边界检查,导致缓冲区溢出
    printf("Input processed: %s\n", buffer);
}

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("Usage: %s <payload>\n", argv[0]);
        return 1;
    }
    vulnerable_function(argv[1]);
    return 0;
}

漏洞利用步骤:

  • 计算偏移量:通过调试(如gdb)分析栈帧,确定返回地址在栈上的偏移量(假设为-0x18,即16字节)。
  • 构造payload:构造字符串,包含A*偏移量(填充至返回地址位置)+ shellcode(如系统调用execve的shellcode)+ 返回地址(跳转到shellcode的地址)。例如,若返回地址为0xdeadbeef,shellcode地址为0x12345678,则payload为:A*16 + shellcode + 0xdeadbeef(小端系统下为0xef be ad de 12 34 56 78)。
  • 执行:运行程序并输入payload,程序返回地址被覆盖,跳转到shellcode,执行系统命令(如/bin/sh),获取shell权限。

5) 【面试口播版答案】
“缓冲区溢出漏洞利用的核心是通过覆盖函数返回地址,使程序跳转到我们控制的恶意代码执行。在Linux环境下,函数调用时栈帧会保存返回地址,当缓冲区写入超过容量时,会覆盖返回地址。比如,假设一个函数中有一个64字节的缓冲区,输入超过64字节后,会覆盖返回地址,导致程序返回时跳转到我们构造的shellcode。具体步骤是:计算返回地址在栈上的偏移量,构造包含shellcode和跳转地址的payload,覆盖返回地址后,程序执行shellcode,获取shell权限。以360安全卫士的某个本地模块为例,假设模块中有类似函数,通过分析其栈布局,计算偏移量,构造payload,最终执行shellcode,获得系统权限。”

6) 【追问清单】

  • 问题:如何处理栈上的数据执行保护(NX位)?
    回答要点:通过返回导向编程(ROP),利用现有函数的指令链,绕过NX保护,执行代码。
  • 问题:如何应对地址空间布局随机化(ASLR)?
    回答要点:利用信息泄露(如栈上变量地址),计算偏移量;或使用ROP技术,通过现有函数的地址加载shellcode。
  • 问题:具体到360安全卫士的某个模块,如何确定栈布局?
    回答要点:通过动态分析(如gdb调试),分析函数调用时的栈帧,确定返回地址、缓冲区的偏移量。
  • 问题:构造payload时,如何处理字节序(小端/大端)?
    回答要点:根据目标系统的字节序,正确排列地址字节(小端系统低字节在前)。
  • 问题:如果函数有栈保护(如canary),如何绕过?
    回答要点:利用栈保护绕过技术,如修改canary值,或使用ROP绕过。

7) 【常见坑/雷区】

  • 偏移量计算错误:忘记考虑栈帧中其他变量的占用空间,导致payload无法正确覆盖返回地址。
  • shellcode地址错误:跳转地址与实际shellcode位置不符,导致跳转失败。
  • 忽略栈保护:未考虑NX、DEP、canary等保护机制,导致代码无法执行。
  • payload包含无效字符:输入中包含不可打印字符或系统过滤字符,导致程序崩溃。
  • 函数调用栈变化:不同函数的栈帧布局不同,偏移量计算错误。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1