linux(x86) exploit 开发系列6:使用return-to-plt绕过ASLR

What is ASLR?

Address space layout randomization (ASLR) is an exploit mitigation technique that randomizes

  • Stack address.

  • Heap address.
  • Shared library address.
#echo 2 > /proc/sys/kernel/randomize_va_space

libc base address would get randomized.

NOTE: Only libc base address is randomized, offset of a particular function from its base address always remains constant!! Hence if we can bypass shared library base address randomization, vulnerable programs can be successfully exploited (using below three techniques) even when ASLR is turned on!!

  • Return-to-plt (this post)

  • Brute force (part 2)
  • GOT overwrite and GOT dereference (part 3)

What is return-to-plt?

In this technique instead of returning to a libc function (whose address is randomized), attacker returns to a function’s PLT (whose address is NOT randomized – its address is known prior to execution itself). Since ‘[email protected]’ is not randomized, attacker no more needs to predict libc base address instead he can simply return to ‘[email protected]’ inorder to invoke ‘function’.

What is PLT, how does invoking ‘[email protected]’ invokes ‘function’?

不像静态库一样,共享库的text段是被多个进程共享的,只有data段是每个进程独有的。这种设计减少了内存和磁盘的占用。由于text段是被多个进程共享的,所以text段就只有读和执行权限,因此动态链接器就不能在text段内重定位数据符号和函数地址。那动态链接器是怎样在不修改text段的前提下在运行时重定位共享库符号呢?,这是通过PIC实现的

PIC是什么?

PIC是为了这样一个事情而开发的--他保证了共享库text段被各个进程使用而不需要考虑加载时的重定向问题。PIC是通过一个间接的方式实现这一目标的--共享库的text段不包含一个绝对的虚拟地址,而是指向数据段的一个特定的表。这个表保存了全局符号和函数的绝对虚拟地址。动态链接器会在重定向的过程中填充这个表。这样的话在重定向的时候就只需要修改data段而不会影响text段

动态链接器在重定向全局符号和函数时用了以下两种方式

全局偏移表(GOT):全局偏移表对于每个全局变量都包含四个字节的条目,这四个字节包含了全局变量的地址。当代码段的指令引用全局变量时,并不是使用全局变量的绝对虚拟地址,而是指向GOT中的一个条目。这个GOT条目在共享库加载时会被动态链接器重定向。这样,PIC通过这个表间接的重定向了全局符号

过程连接表(PLT):PLT对于每个全局函数包含了一段桩代码。text段的函数调用并不是直接调用函数(function),而是调用了桩程序([email protected])。这段桩代码在动态链接器的帮助下解析函数的地址并将其复制到GOT中,这个解析过程只在第一次调用函数时发生,如果之后再次调用函数(调用桩代码),桩代码不会再解析函数地址,而是直接从GOT中获取函数地址,然后跳转过去。Thus PIC uses this table to relocate function addresses with two level of indirection.

这种技术需要程序使用了我们需要的函数才有[email protected]

时间: 2024-10-23 19:06:09

linux(x86) exploit 开发系列6:使用return-to-plt绕过ASLR的相关文章

linux(x86) exploit 开发系列5:使用ret2libc链绕过NX

A simple way to chain multiple libc functions is to place one libc function address after another in the stack, but its not possible because of function arguments. chaining seteuid, system and exit would allows us to exploit the vulnerable code 'vuln

SploitFun Linux x86 Exploit 开发系列教程

原文:Linux (x86) Exploit Development Series 在线阅读 PDF格式 EPUB格式 MOBI格式 Github 译者 章节 译者 典型的基于堆栈的缓冲区溢出 hackyzh 整数溢出 hackyzh Off-By-One 漏洞(基于栈) hackyzh 使用 return-to-libc 绕过 NX bit hackyzh 使用链式 return-to-libc 绕过 NX bit hackyzh 绕过ASLR – 第一部分 hackyzh 绕过ASLR –

linux(x86) exploit 开发系列4:使用return2libc绕过NX

What is NX Bit? Its an exploit mitigation technique which makes certain areas of memory non executable and makes an executable area, non writable. Example: Data, stack and heap segments are made non executable while text segment is made non writable.

linux(x86) exploit 开发系列3:off-by-one

What is off-by-one bug? Copying source string into destination buffer could result in off-by-one when Source string length is equal to destination buffer length. When source string length is equal to destination buffer length, a single NULL byte gets

linux(x86) exploit 开发系列2:整数溢出

What is Integer Overflow? Storing a value greater than maximum supported value is called integer overflow. Integer overflow on its own doesnt lead to arbitrary code execution, but an integer overflow might lead to stack overflow or heap overflow whic

Linux (x86) Exploit 开发系列教程之六(绕过ASLR - 第一部分)

原文地址:https://www.cnblogs.com/momoli/p/10869736.html

Linux (x86) Exploit系列之三 Off-By-One 漏洞 (基于栈)

Off-By-One 漏洞 (基于栈) 原文地址:https://bbs.pediy.com/thread-216954.htm 什么是off by one? 将源字符串复制到目标缓冲区可能会导致off by one 1.源字符串长度等于目标缓冲区长度. 当源字符串长度等于目标缓冲区长度时,单个NULL字节将被复制到目标缓冲区上方.这里由于目标缓冲区位于堆栈中,所以单个NULL字节可以覆盖存储在堆栈中的调用者的EBP的最低有效位(LSB),这可能导致任意的代码执行. 一如既往的充分的定义,让我们

linux下C++开发系列(六)——文件IO相关的系统调用

linux操作系统中,文件是最基本和最重要的抽象,linux遵循一切皆文件的理念.按照不同的属性,文件可以分为普通文件和特殊文件.特殊文件是以文件方式表示的内核对象,linux支持四种类型的特殊文件: 1.块设备文件 (例如硬盘设备) 2.字符设备文件(例如键盘设备) 3.命名管道 (主要是进程间通信使用) 4.Unix域套接字(主要是网络通信使用) linux系统对于文件的操作,提供了一系列的系统调用个,主要分为以下几类: 1.创建文件(creat) 2.打开文件(open) 3.读文件(re

【转】TI-Davinci开发系列之六CCS5.2调试Linux内核

上转博文<TI-Davinci开发系列之五CCS5.2使用gdbserver远程调试应用程序> 使用CCS5.2远程调试内核时,只需导入Linux内核源码,而不需要编译内核,也就不会用到交叉编译链,同时不需要使用gdbserver,但需要仿真器XDS560V2,所以Windows和Linux都可以完成,但考虑到Windows CCS5.2软件成熟,bug较少,且Windows易于操作,故本文推荐并主要介绍Windows版CCS5.2调试内核的方法.在介绍远程调试Linux之前,务必保证仿真器X