BUUCTF-PWN gyctf_2020_bfnote(劫持TLS结构,ret2_dl_runtime_resolve)

本文详细分析了一道带有Canary保护的栈溢出题目gyctf_2020_bfnote,涉及延迟绑定技术、函数plt调用过程、Canary机制以及漏洞利用策略。通过伪造rel和sym结构,实现ret2dl_runtime_resolve,最终绕过Canary防护并进行任意内存写操作。
摘要由CSDN通过智能技术生成

程序分析

在这里插入图片描述
一道带有canary的栈溢出题目

main函数是吧ebp-4中存放地址再减四获得的

在这里插入图片描述
调试结果如下
在这里插入图片描述
我们把这里的地址改为bss+gap+4,并在bss+gap的地址放入我们的ROP链即可(这里需要留出一段空间防止执行某些函数时rsp减小而修改了got表变量)
在这里插入图片描述

背景知识

延迟绑定

本题需要利用ret2al_runtime_resolve,涉及到延迟绑定的技术,简单介绍一下函数绑定的过程,以atol的调用为例
我们看一下第一次调用程序atol,此时atol_got存放着atol@plt+6的地址
在这里插入图片描述
程序把0x40压入栈之后,跳到了0x08048450
在这里插入图片描述

该函数把linkmap压入栈,然后跳向0x0804a008存放的地址
在这里插入图片描述
而这个地址中存放的就是_dl_runtime_resolve的地址
在这里插入图片描述
之后就会在Libc中找到该函数并把它放入atol_got中
大致流程就是这样,下面介绍两个在该过程中涉及的结构体
符号表.dynsym节,它是一个结构体Elf32_Sym数组,定义如下

typedef struct
{
   
  Elf32_Word    st_name; //st_name指向的是函数名称在.dynstr表中的偏移
  Elf32_Addr    st_value;
  Elf32_Word    st_size;
  unsigned char st_info; //对于导入函数符号而言,它是0x12
  unsigned char st_other;
  Elf32_Section st_shndx;
}Elf32_Sym; //对于导入函数符号而言,其他字段都是0

重定位表.rel.plt为一个Elf32_Rel数组,定义如下

typedef struct {
   
    Elf32_Addr        r_offset;//got表地址,即函数地址写入的位置,
    Elf32_Word       r_info;//r_info>>8表示该函数对应在符号表.dynsym中的下标,r_info&0xff则表示重定位类型,本题需要r_info&0xff为0x7,因为类型需为ELF_MACHINE_JMP_SLOT以绕过类型验证
} Elf32_Rel;

程序的节信息可以通过readelf查看
在这里插入图片描述

回到atol第一次执行的时候
程序把0x40压入栈,这是atol函数的ELF32_REL结构与.rel.plt节的偏移
在这里插入图片描述
之后入栈的0x0804a004为link_map,程序先从第一个参数link_map获取字符串表.dynstr、符号表.dynsym以及重定位表.rel.plt的地址,通过参数0x40即.rel.plt表中的偏移加上.rel.plt的地址获取函数atol对应的重定位结构Elf32_Rel的位置

在这里插入图片描述

结构体第一个参数就是atol的GOT地址

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值