ret2libc
hexo
什么样的题是ret2libc,这类题该怎么做?
程序的特征是:
能进行栈溢出,没有system
函数,也没有"/bin/sh"
参数
无法进行常规的ret2text
ret2libc的关键是获取libc的版本,所以需要获得libc.so
中函数的偏移量,
所以需要一个输出函数,.got.plt
中需要有libc中的函数,我们才能获取到libc中函数的真实地址
从而利用LibcSearcher确定libc版本
LibcSearcher原理?
基地址范围?
前置知识:
libc中有system
函数,而libc.so
动态偏移链接库中的函数之间的相对偏移是固定的
ALSR保护不会随机内存地址的后12位(后3个字节)
pwntools
基本语法:elf.got()
返回的是.got
中函数 相对plt基地址的偏移量elf.plt()
返回的是.plt
中函数 相对got基地址的偏移量
常用函数
write()
函数是C标准库(libc)中的一个系统调用,常用于向文件描述符写入数据:
1 |
|
参数
fd
:目标文件描述符
常见:
0
:标准输入1
:标准输出2
:标准错误输出open
系统调用获取文件描述符
buf
:源数据缓冲区count
:要写入的字节数
返回值
- 成功 返回写入的字节数
- 失败 返回-1
LibcSearcher
Usage
原版接口
1 |
|
新增接口
1 |
|
如果未知libc版本,在本地泄漏libc版本和在远程泄漏libc版本是不同的!
因为在本地程序运行时加载的是本地的libc版本!
LibcSearcher找到的也是本地的libc版本!
找不到正确的libc可以add_condition
添加限制条件
经典例题:ctfshow pwn107
ret2libc
http://example.com/2024/11/04/ret2libc/