pwn小白入门06--ret2libc

概述:

前文介绍了ROP的基本原理,但前面的方法有一些局限性,一旦目标程序调用的函数较少,或者使用动态编译,就会导致我们可以利用的gadget变少,从而无法达到利用效果。为了解决这种问题,我们可以选择使用ROP的方式,到动态链接库里面寻找gadget。即ret2libc。

静态链接和动态链接:

链接:程序经过预处理,编译,汇编,链接之后可以生成可执行文件,链接可以将多个汇编之后的程序拼在一起。也可以链接函数库,库是一种软件组件技术,库里面封装了数据和函数,比如常用的printf,get函数。链接包含函数库,可以方便代码的复用,避免重复造轮子。

静态链接:

前面的所讲的ret2syscall所利用的二进制程序就是经过静态链接得到的。静态链接就是将整个库直接链接到程序中,一般这样的程序占用空间会比较大,并且会有很多不会用到的函数。

动态链接:

随着系统中可执行文件的增加,静态链接所带来的磁盘和内存空间浪费问题愈发严重。例如大部分可执行文件都需要glibc,那么在静态链接的时候就需要把libc.a和编写的代码链接进去,单个libc.a的大小为5M左右,那么1000个就是5G。如果两个静态链接的可执行文件都包含testLib.o,那么在装载入内存时,两个相同的库也会被装载进去,造成内存空间的浪费。静态链接另一个明显的缺点就是,如果对标准函数哪怕做了一点很微小的改动,都需要重新编译整个源文件,使得开发和维护很艰难。
如果不把系统库和自己编写的代码链接到一个可执行文件,而是分割成两个独立的模块,等到程序真正运行时,再把这两个模块进行链接,就可以节省硬盘空间,并且内存中的一个系统库可以被多个程序共同使用,还节省了物理内存空间。这种在运行或加载时,在内存中完成链接的过程叫做动态链接,这些用于动态链接的系统库称为共享库,或者共享对象,整个过程由动态链接器完成。
Linux下动态库文件的文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件。

PLT&GOT表以及延迟绑定机制:

yichen大佬的文章,写的非常详细:地址
视频讲解

参考资料:《程序员的自我修养-链接、装载与库》

利用方式:

下面我们将使用三个例题从易到难来讲解ret2libc的利用方式:

难度一:

例题初探:

程序中存在system函数和/bin/sh字符串,但与ret2text不同的是,此时的system函数的参数并不是/bin/sh,而是一个奇怪字符:
在这里插入图片描述

并且/bin/sh所在的位置为:

如果我们单纯的将返回地址覆盖为system的地址,程序就会执行system(“shell!?”),但是shell!?并不是一个系统命令,此时程序执行会产生错误,就相当于我们直接在命令行敲shell!?,系统会提示找不到命令,但如果敲/bin/sh就会返回一个真正的shell。如果我们要想利用system函数并且让程序返回一个shell,那么我们就必须要让system函数的参数变为/bin/sh。

那么如何让system的参数变成/bin/sh?

首先回顾一下汇编调用过程:汇编调用函数过程中会首先将参数压栈,然后返回地址压栈,然后是ebp的地址。
在这里插入图片描述
当程序调用system函数时,会自动去寻找栈底即ebp指向的位置,然后将ebp+8字节的位置的数据当作函数的参数,所以如果我们想将/bin/sh作为system函数的参数,就可以在栈溢出的时候,先修改eip为system函数的地址,然后填充4个字节的垃圾数据,再将/bin/sh的地址写入栈上,这样调用system函数的时候,就可以将/bin/sh作为参数,然后返回一个shell。
在这里插入图片描述
注意: 为什么是在eip(即system函数地址)后面覆盖4个字节垃圾数据而不是前面提到的8个字节,这是因为当我们调用system函数的时候,在system函数中会首先执行push ebp指令,将4字节的ebp地址压入栈中,而此时的栈底距离我们的参数/bin/sh正好8字节,所以我们应该填充4字节垃圾数据。

完整利用过程:

首先checksec:

在这里插入图片描述

32位程序,无canary,无pie。

32位ida pro打开:

在这里插入图片描述
明显的栈溢出漏洞。
在这里插入图片描述
存在system函数,地址为:
在这里插入图片描述
/bin/sh地址为:
在这里插入图片描述

然后动态调试确定栈溢出大小:
在这里插入图片描述
脚本如下:

from pwn import *

sh = process('./ret2libc1')

binsh_addr = 0x8048720
system_plt = 0x08048460
payload 
  • 39
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
pwn ret2libc是一种攻击技术,其原理是通过利用程序中的栈溢出漏洞,来控制程序的执行流程,以达到执行libc中的函数的目的。 在ret2libc攻击中,程序会调用libc库中的函数,例如system函数,来执行特定的操作。但是在程序中没有自带的/bin/sh字符串,所以需要通过其他方式获取执行shell命令的能力。 具体而言,攻击者会利用程序中的栈溢出漏洞,将栈上的返回地址修改为在libc库中的某个函数的地址,例如puts函数。然后通过执行puts函数,将栈上保存的函数地址打印出来。由于libc库中的函数地址相对位置是不变的,攻击者可以根据已知的函数地址和libc的版本来计算system函数的真实地址。然后再利用system函数执行特定的操作,比如执行shell命令。 总结来说,pwn ret2libc攻击的原理是通过栈溢出漏洞修改返回地址为libc库中的一个函数地址,然后根据已知的函数地址和libc的版本计算出system函数的真实地址,最终实现执行shell命令的目的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [pwn学习——ret2libc2](https://blog.csdn.net/MrTreebook/article/details/121595367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [pwn小白入门06--ret2libc](https://blog.csdn.net/weixin_45943522/article/details/120469196)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏璃只想划水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值