image.png

1. Linux延迟绑定机制的概念

  • 延迟绑定机制:程序调用libc库的函数(如putsprintf)时,并不会在程序加载时立即解析这些函数的实际地址,而是等到程序运行过程中第一次调用该函数时才解析。

  • 作用:这样可以减少程序启动时间和节省内存,只有在需要时才加载具体的库函数地址。

2. 实现延迟绑定的关键技术

  • PLT表(Procedure Linkage Table)

  • 每个libc函数在程序中都有一个对应的PLT条目。

  • 初次调用函数时,通过call puts@plt跳转到PLT条目。

  • PLT表存储的内容

    1. 初次调用时,PLT条目指向GOT表(Global Offset Table)的一个动态链接器入口,用于加载函数实际地址。

    2. 解析完成后,PLT会通过jmp [puts_got]直接跳转到函数的实际地址。

  • GOT表(Global Offset Table)

  • GOT表保存函数实际地址的指针。

  • 初次解析时,动态链接器将实际地址存入GOT表,这样后续调用该函数时可直接通过GOT表快速访问。


1. PLT表与GOT表的概念

  • PLT表(Procedure Linkage Table)

  • PLT表用于存储程序调用外部库函数(如libc函数)的入口点,负责引导程序正确跳转到实际函数地址。

  • 程序中每个外部函数调用如puts,都有一个对应的plt入口(如puts@plt)。

  • GOT表(Global Offset Table)

  • GOT表存储了外部函数的实际地址。

  • 在延迟绑定机制中,程序启动时GOT表中的初始值会指向动态链接器,调用该函数时动态链接器解析地址并填充到GOT表中。


2. 延迟绑定流程

流程图分步解释

  1. 函数调用:call puts@plt

  • 程序调用外部函数(如puts)时,会跳转到PLT表中对应的puts@plt条目。

  1. PLT表第一次跳转:jmp *(puts_got)

  • 初次调用时,GOT表的puts_got项尚未填充实际地址,指向动态链接器的一个入口(如_dl_runtime_resolve)。

  • 程序会继续执行PLT0的代码。

  1. 动态链接器解析地址

  • PLT0通过GOT表的.dynamiclinkmap条目定位动态链接器。

  • 动态链接器根据符号表和库加载信息,找到外部函数puts的实际地址。

  1. 填充GOT表

  • 动态链接器将puts的实际地址写入GOT表中的puts_got项。

  1. 后续调用:直接跳转到puts

  • GOT表已填充实际地址,后续调用puts时,PLT表会通过GOT表的地址直接跳转到puts函数,避免再次解析。


3. ROP与Ret2Libc的关联

  • ROP(Return-Oriented Programming)

  • 攻击者可以通过劫持程序的返回地址,在PLT表中跳转到libc函数(如system),利用GOT表中的已解析地址实现任意代码执行。

  • Ret2Libc

  • 利用延迟绑定机制中的PLT和GOT表,通过伪造返回地址或参数,调用libc中预先加载的函数(如system)执行攻击。


延迟绑定对于我们意味着什么?

GOT表:

一个绝佳的攻击目标

包含libc函数真实地址,用于泄露地址

覆盖新地址到GOT表,劫持函数流程

PLT表

不用知道libc函数真实地址,使用PLT地址即可调用函数

Libc是什么?

Libc就是LInux下的C函数库,Libc中包含各种常用函数,程序执行时才被加载到内存中,Libc一定可执行,跳转到libc中函数可以跳过NX保护

Libc函数在哪里?

ASLR地址随机保护

系统开启 /proc/sys/kernel/randomizevaspace

0表示关闭ASLR

1表示保留的随机化、共享库、栈、mmap0以及VDS0随机化

2表示完全的随机化,在1的基础上,通过brk()分配的内存空间也将被随机化

image.png

如何使用ret2libc

我们为了绕过NX,然后使用了ret2libc,然后又有了地址随机化,随意我们还需要泄露libc地址。

ret2libc = leak libc地址 + system(/bin/sh)

简单来说

泄露任意一个函数的真实地址:只有被执行过的函数才能获取地址

根据偏移获取shell和sh的位置