pwn技巧之ret to libc

ret to libc是一种常见的0day攻击手段,通过控制EIP、泄露库函数基地址和设置system参数来实现远程打开shell。文章介绍了在Linux环境下,如何利用栈溢出、got表、虚函数表等方法控制EIP,以及通过栈帧、got表或爆破获取libc基地址,并在32位和64位系统中设置system参数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

在0day攻击当中有许多的技巧,这次介绍一种常用的攻击手段。ret to libc与栈溢出,堆溢出之类的漏洞利用技巧有所不同。ret to libc是一种在漏洞攻击中的常用的思路。目的是最大化利用所发现的漏洞,实现我们最终的目标get shell

首先,我们来认识一个c语言的库函数

int system(const char * string);

这个函数的的功能很简单,执行一条shell命令。而ret to libc目标很简单,就是用我们指定的参数执行这一函数。当然想要执行什么命令就要看具体情况了,最通用的就是执行/bin/sh命令,这样我们就可以远程打开一个终端。然后嘛(→_→)我就不知道了。

其实ret to libc还有一个老大哥,就是shellcode。不过随着计算机安全防护技术的发展,shellcode已经渐渐的失去了用武之地。

利用方法

PS:此处利用环境是linux下。windows下略有不同
ret to libc这种攻击方法需要三个前置的条件,只有三个条件同时满足才能成功

控制EIP

我们第一件要做的事情就是要控制EIP。至于如何控制就要看具体的情况了。
这里介绍几个常用可以控制EIP的方法。
1.函数返回地址
最常见的控制EIP的地方,函数调用的时候都会将返回地址放在栈中,如果修改这个值,就以控制程序跳转到我们需要的地方。最常见的修改返回地址的方法就是用栈溢出覆盖,当然还有许许多多脑洞大开的方法。

2.got表
got表也是一个经常利用来控制EIP的地方,可以查阅一下 –> 延迟绑定技术
其实很简单,我们所有对c库函数的调用,都是通过一些指向函数的指针来完成的,这些指向函数的指针放在一起,就是一个got表。比如got表中有一个指向free函数的指针。我们把它指向的地址改成了指向system,那么所有调用free的函数就都变成了调用system

3.c++虚函数表指针
在c++的虚函数指针会存放在对象内存的第一个位置。如果能够改写它的位置,使它指向我们所设计“虚函数表”。然后调用虚函数,程序就会跳转到我们想要的地方了。
当然,还有一个方法就是直接修改实例指针,也可以实现这一点,当然指针的指针的指针这种c/c++特产是少不了了。
篡改实例指针 –> 伪造的虚函数指针 –> 伪造的虚函数表 –> system函数

4.指向函数的指针
这个就多了去了,具体情况具体分析吧。

leak基地址

讲了这么多跳转到system函数的方法。但是必须要知道system函数的地址才能够跳转。然而system函数到底在哪里?
一般system函数会与所有的c库函数一起通过libc加载到程序中(linux下)。(所以叫ret to libc)每个c语言程序都可以调用system函数。而system函数在libc中的位置是固定的。objdump或者ida直接找到就可以了。关键的问题是我们不知道libc在加载到程序中后,它的基地址是多少。每次程序运行时,libc的基础地址会变动。要解决的问题就是leak(泄露)基地址。一旦得到基地址,就可以用 “基地址 + system在libc中地址”计算出system的真实地址。至于怎么leak基地址,那就要各显神通了。只要能够定位一个库函数的具体地

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值