前置知识:函数执行流程
linux系统中 为了提高动态链接装载时的效率 ,elf文件会采取一种叫做延迟绑定(lazy binding)的技术,也就是当我们位于动态链接库的函数被调用的时候,程序才会重定位 函数的偏移 , 修改got表 ,下面简单介绍这个机制的实现过程,主要使用dl_runtime_resolve来实现
下面 写下dl_runtime_resolve 函数 调用的关键数据结构
按照 dl_runtime_resolve 的调用顺序
.rel.plt
- <ii | r_offset , r_info
- r_offset 为修改的指令地址
- r_info 中 高24位是目标指令在动态符号表的索引 , 低8位 是 属性
.dynsym
- <iiii | st_name , st_value , st_size , st_info
- st_name 是 符号名在 .dynstr表中的偏移
- st_info 高28位 为符号绑定信息 , 低四位 是符号类型 ,目前使用的是 0x12 1 << 28 | 2 , 绑定信息为 全局符号 , 符号属性为 函数或其他可执行代码
.dynstr
- 此表没有具体结构,由一个个字符串组成,以\0分隔
详细介绍见代码注释
例子 : [Xman] level4
使用 roputils 模块 进行 ret2dl_resolve
例题 : 0ctf - babystack
- file : 32位 ,动态链接
- checksec : nx
- info : 这题因为只调用了read函数 , 无法leak,所以需要使用 ret2dl_resolve,但是这题的溢出长度有限,所以需要将两次溢出 才能完成全部动作, 第一次读入相关信息,第二次调用dl_runtime_resolve 并且传入参数
网友评论