ret2dlresolve

ret2dlresolve主要是利用函数进行plt表进行动态链接的时候,通过一系列的跳转才能找到got表,就是利用的这个过程进行漏洞攻击

_dl_runtime_resolve函数调用

参考:[原创]ROP高级用法之ret2_dl_runtime_resolve-二进制漏洞-看雪-安全社区|安全招聘|kanxue.com

  1. 首先用link_map访问.dynamic,分别取出.dynstr、 .dynsym、 .rel.plt的地址
  2. .dynamic的地址加0x44的位置是.dynstr
    .dynamic的地址加0x4c的位置是.dynsym
    .dynamic的地址加0x84的位置是.rel.plt
  3. .rel.plt + 参数reloc_index,求出当前函数的重定位表项Elf32_Rel的指针,记作rel
  4. rel->r_info >> 8作为.dynsym的下标,求出当前函数的符号表项Elf32_Sym的指针,记作sym
  5. .dynstr + sym->st_name得出符号名字符串指针
  6. 在动态链接库查找这个函数的地址,并且把地址赋值给*rel->r_offset,即GOT表
  7. 最后调用这个函数

下面是XDCTF 2015 pwn200

源码:Advanced ROP (yuque.com)

现在通过strlen函数来演示这个过程

1

首先,进入这个函数

2

看到那两个push,取得以下的值

reloc_index=0x18

link_map=0x804b220

3

通过link_map里面的函数继续进行寻找

4

第三个地址就是.dynamic

.dynamic=0x0804b128

5

.dynamic的地址加0x44的位置是.dynstr
.dynamic的地址加0x4c的位置是.dynsym
.dynamic的地址加0x84的位置是.rel.plt

.dynstr:0x080482c8

.dynsym:0x08048228

.rel.plt:0x0804839c

rel(Elf32_Rel的指针)=.rel.plt+reloc_index

rel=0x18+0x0804839c=0x080483b4

6

r_offset=0x0804b234

r_info=0x00000507

7

接着r_info>>8 =5作为下标,来到.dynsym的位置

找到0x0000001a

8

最后在动态链接库查找这个函数的地址,并且把地址赋值给*rel->r_offset,即GOT表就可以了

攻击

原理

利用改变最后那个地址的函数的名字岂不是可以随意调用函数了

手法

而index_arg即参数n是我们可以控制的,我们需要做的是通过一系列操作。把index_arg可控转化为st_name可控;我们需要在一个可写地址上构造一系列伪结构就可以完成利用或在条件允许的情况下直接修改.dynstr
所以我们需要在程序中找一段空间start出来,放我们直接构造的fake_dynsym,fake_dynstr和fake_rel_plt等,然后利用栈迁移的手法将栈转移到start

下面演示这道题的做法(用ret2dlresolve)