目录
预备知识
一、GOT与PLT
GOT(Global Offset Table,全局偏移表)是Linux ELF文件中用于定位全局变量和函数的一个表。PLT(Procedure Linkage Table,过程链接表)是Linux ELF文件中用于延迟绑定的表,即函数第一次被调用的时候才进行绑定。
所谓延迟绑定,就是当函数第一次被调用的时候才进行绑定(包括符号查找、重定位等),如果函数从来没有用到过就不进行绑定。基于延迟绑定可以大大加快程序的启动速度,特别有利于一些引用了大量函数的程序。打个比方,你一次性去超市买了一大堆物品,但是其中有些物品可能你永远也不会使用,这样就浪费了钱财;而延迟绑定就相当于需要的时候才去超市买东西,这样就节省了开支。
下面简单介绍一下延迟绑定的基本原理。假如存在一个bar函数,这个函数在PLT中的条目为bar@plt,在GOT中的条目为bar@got,那么在第一次调用bar函数的时候,首先会跳转到PLT,伪代码如下:
bar@plt:
jmp bar@got
patch bar@got
这里会从PLT跳转到GOT,如果函数从来没有调用过,那么这时候GOT会跳转回PLT并调用patch bar@got,这一行代码的作用是将bar函数真正的地址填充到bar@got,然后跳转到bar函数真正的地址执行代码。当我们下次再调用bar函数的时候,执行路径就是先后跳转到bar@plt、bar@got、bar真正的地址。
二、信息泄漏的实现
在进行缓冲区溢出攻击的时候,如果我们将EIP跳转到write函数执行,并且在栈上安排和write相关的参数,就可以泄漏指定内存地址上的内容。比如我们可以将某一个函数的GOT条目的地址传给write函数,就可以泄漏这个函数在进程空间中的真实地址。
如果泄漏一个系统调用的内存地址,结合libc.so.6文件,我们就可以推算出其他系统调用(比如system)的地址。
三、libc.so.6文件的作用
在一些CTF的PWN题目中,经常可以看到题目除了提供ELF文件之外还提供了一个libc.so.6文件,那么这个额外提供的文件到底有什么用呢?
如果我们可以利用目标程序的漏洞来泄漏某一个函数的地址,那么我们就可以计算出system函数的地址了,当然,被泄露地址的函数必须也定义在libc.so.6中(libc.so.6中通常也存在有/bin/bash或者/bin/sh这个字符串)。
计算system函数地址的基本原理是,在libc.so.6中,各个函数的相对地址是固定的,比如函数A相对于libc.so.6的起始地址为addr_A,函数B相对于libc.so.6的起始地址为addr_B,那么,如果我们能够泄漏进程内存空间中函数A的地址address_A,那么函数B在进程空间中的地址就可以计算出来了,为address_A+addr_B-addr_A。
四、扩展阅读
本实验涉及到Linux下动态链接的基本原理,如果你想深入了解这方面的知识,可以阅读《程序员的自我修养–链接、装载与库》一书第七章,以及《深入理解计算机系统》一书第七章。
实验目的
1)了解ELF文件中PLT与GOT的基本概念;
2)了解题目提供的libc.so文件在解题过程中的作用;
3)掌握基于write函数泄漏信息的基本原理。
实验环境

服务器:CentOS 6.5,IP地址:10.1.1.101
测试机:Windows XP,IP地址随机
辅助工具:Python,IDA Pro,PuTTY,checksec
实验步骤一
题目描述:
在CentOS服务器的/home/test/pwn/3目录下存放了pwn3、start_service.py、li

本文介绍了通过Linux下的write函数实现信息泄漏的技术,讲解了GOT、PLT、libc.so.6的作用,以及如何利用write泄漏函数地址以获取服务器控制权。通过实验步骤展示了如何在存在NX保护的情况下,通过两次缓冲区溢出来执行system('/bin/sh')。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



