博客
关于我
Return to Libc Attack
阅读量:277 次
发布时间:2019-03-01

本文共 2005 字,大约阅读时间需要 6 分钟。

前言

这段文字来自乌云备份文章,详细介绍了r2libc技术的原理及其在缓冲区溢出攻击中的应用。r2libc技术通过覆盖栈帧中的返回地址,跳转到libc库中的特定函数(如system),从而绕过了传统缓冲区溢出攻击中由于ASLR和堆栈保护机制带来的限制。这种技术在实际攻击中尤为重要,因为它允许攻击者利用已存在的libc函数执行恶意代码。

摘要和总结

在前一章中,我们通过缓冲区漏洞将恶意代码附加到缓冲区后面,并通过覆盖返回地址来执行栈中的shellcode。然而,由于现代操作系统的防护机制(如ASLR和堆栈保护),直接在栈中执行代码已不再可行。因此,我们需要寻找替代方法,即通过覆盖返回地址,跳转到内存中已存在的程序(如libc中的system函数),并利用该函数执行恶意命令。

本章将介绍如何在32位环境中实现这一点。我们将详细探讨如何获取system和exit函数的地址,如何构造参数地址,以及如何利用生成的badfile进行实际攻击。通过这些步骤,我们将成功实现return-to-libc攻击,执行所需的恶意命令。

函数的进入离开过程

在32位环境中,函数的调用和返回遵循特定的汇编指令。例如,进入函数时,程序会将ebp(扩展程序寄存器)保存到栈顶,并将esp(扩展栈指针)设置为当前栈帧的起始位置。离开函数时,程序会恢复ebp到esp,并从栈中弹出返回地址。理解这些步骤对于分析return-to-libc攻击至关重要。

Return to Libc Attack

在return-to-libc攻击中,我们的目标是覆盖函数返回地址(即return address),并将其指向libc中的system函数。这样,当程序执行该函数时,system会执行其参数所指定的命令。具体来说,我们需要找到system函数的地址,并将其填入返回地址的位置。此外,我们还需要确保系统参数的正确传递。

在32位环境中,参数的传递通过栈而非寄存器完成。因此,我们需要在栈中构造参数的位置,确保system函数能够正确解析和执行所需的命令。例如,在栈中,我们需要设置参数地址,使其指向我们想要执行的命令(如/bin/sh)。通过这一步,我们可以绕过传统的栈保护机制,成功实现攻击。

具体操作

为了实现return-to-libc攻击,我们需要完成以下几个步骤:

  • 关闭地址随机化和栈保护
  • 在Linux系统中,可以通过以下命令关闭地址随机化和栈保护:

    sudo sysctl -w kernel.randomize_va_space=0

    同时,在编译时加上以下选项:

    gcc -g -fno-stack-protector -z noexecstack -o stack stack.c

    这样可以确保栈中的数据不会被视为代码执行对象,避免被防护机制拦截。

  • 获取system和exit函数的地址
  • system和exit函数属于libc库,其地址可以通过运行时反射或直接调试获取。在32位环境中,这些地址通常位于0x00000000到0x0007ffff的范围内。例如,system函数的地址可能是0xb7da4da0,而exit函数的地址可能是0xb7d989d0。

  • 构造参数地址
  • 在return-to-libc攻击中,参数地址的位置取决于栈的布局。在32位环境中,参数地址通常位于ebp+8的位置(即栈帧中的参数偏移量)。因此,我们需要确保在覆盖返回地址后,参数地址能够正确指向我们想要执行的命令或函数。

  • 生成badfile
  • badfile是用来触发缓冲区溢出漏洞的文件。我们需要手动构造这个文件,确保其包含足够的 NOP(无操作)指令和目标地址。例如:

    char buffer[200];  memset(buffer, 0x90, sizeof(buffer));  *(long *)(buffer+0x6c+4) = 0xb7da4da0;  *(long *)(buffer+0x6c+8) = 0xb7d989d0;  *(long *)(buffer+0x6c+12) = 0xbffffdd8;

    其中,0x6c+4是返回地址的位置,0x6c+8是参数地址的位置,0x6c+12是MYSHELL环境变量的地址。

  • 执行攻击
  • 将生成的badfile写入程序运行目录,并运行程序。通过分析程序的行为,我们可以观察到攻击是否成功。例如,在32位环境中,程序的返回地址被覆盖到system函数的地址,而参数地址被正确设置为/bin/sh的地址。这样,当程序执行system函数时,就会执行所需的恶意命令。

    参考文章

    如果需要更深入的理解,可以参考以下参考文章:

    [1] 《Computer Security》A Hands-on Approach — Wenliang Du

    [2] 《gdb调试之栈栈信息》

    转载地址:http://tmta.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现CircularQueue循环队列算法(附完整源码)
    查看>>
    Objective-C实现clearBit清除位算法(附完整源码)
    查看>>
    Objective-C实现climbStairs爬楼梯问题算法(附完整源码)
    查看>>
    Objective-C实现cocktail shaker sort鸡尾酒排序算法(附完整源码)
    查看>>
    Objective-C实现cocktailShakerSort鸡尾酒排序算法(附完整源码)
    查看>>
    Objective-C实现CoinChange硬币兑换问题算法(附完整源码)
    查看>>
    Objective-C实现collatz sequence考拉兹序列算法(附完整源码)
    查看>>
    Objective-C实现Collatz 序列算法(附完整源码)
    查看>>
    Objective-C实现comb sort梳状排序算法(附完整源码)
    查看>>
    Objective-C实现combinationSum组合和算法(附完整源码)
    查看>>
    Objective-C实现combinations排列组合算法(附完整源码)
    查看>>
    Objective-C实现combine With Repetitions结合重复算法(附完整源码)
    查看>>
    Objective-C实现combine Without Repetitions不重复地结合算法(附完整源码)
    查看>>
    Objective-C实现conjugate gradient共轭梯度算法(附完整源码)
    查看>>
    Objective-C实现connected components连通分量算法(附完整源码)
    查看>>
    Objective-C实现Connected Components连通分量算法(附完整源码)
    查看>>
    Objective-C实现Convex hull凸包问题算法(附完整源码)
    查看>>
    Objective-C实现convolution neural network卷积神经网络算法(附完整源码)
    查看>>
    Objective-C实现convolve卷积算法(附完整源码)
    查看>>
    Objective-C实现coulombs law库仑定律算法(附完整源码)
    查看>>