02_ROP-Ret2Libc概述
1. Linux延迟绑定机制的概念
延迟绑定机制:程序调用
libc
库的函数(如puts
或printf
)时,并不会在程序加载时立即解析这些函数的实际地址,而是等到程序运行过程中第一次调用该函数时才解析。作用:这样可以减少程序启动时间和节省内存,只有在需要时才加载具体的库函数地址。
2. 实现延迟绑定的关键技术
PLT表(Procedure Linkage Table):
每个
libc
函数在程序中都有一个对应的PLT条目。初次调用函数时,通过
call puts@plt
跳转到PLT条目。PLT表存储的内容:
初次调用时,PLT条目指向
GOT表
(Global Offset Table)的一个动态链接器入口,用于加载函数实际地址。解析完成后,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. 延迟绑定流程
流程图分步解释:
函数调用:
call puts@plt
程序调用外部函数(如
puts
)时,会跳转到PLT表中对应的puts@plt
条目。
PLT表第一次跳转:
jmp *(puts_got)
初次调用时,GOT表的
puts_got
项尚未填充实际地址,指向动态链接器的一个入口(如_dl_runtime_resolve
)。程序会继续执行PLT0的代码。
动态链接器解析地址
PLT0通过GOT表的
.dynamic
或linkmap
条目定位动态链接器。动态链接器根据符号表和库加载信息,找到外部函数
puts
的实际地址。
填充GOT表
动态链接器将
puts
的实际地址写入GOT表中的puts_got
项。
后续调用:直接跳转到
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()分配的内存空间也将被随机化
如何使用ret2libc
我们为了绕过NX,然后使用了ret2libc,然后又有了地址随机化,随意我们还需要泄露libc地址。
ret2libc = leak libc地址 + system(/bin/sh)
简单来说
泄露任意一个函数的真实地址:只有被执行过的函数才能获取地址
根据偏移获取shell和sh的位置