5 堆或 BSS 的缓冲区溢出

  • 堆或 BSS 的内容

    • 字符串常量
    • 全局变量
    • 静态变量
    • 动态分配的内存
  • 示例:覆盖文件指针

    /* The following variables are stored in the BSS region */
    static char buf[BUFSIZE], *tmpfile;tmpfile = "/tmp/vulprog.tmp";
    gets(buf); /* buffer overflow can happen here */... Open tmpfile, and write to it ...

    • Set-UID 程序的文件指针指向了/tmp/vulprog.tmp
    • 程序需要在执行期间,使用用户输入写入文件、
    • 如果我们可以使文件指针指向/etc/shadow,我们就可以使程序写入它。
    • 我们可以使用缓冲区溢出来改变变量tmpfile的内存。通常,它指向了/tmp/vluprog.tmp字符串。使用缓冲区溢出漏洞,我们就可以将tmpfile的内容修改为0x903040,它就是字符串/etc/shadow的地址。之后,当程序使用tmpfile变量打开文件来写入时,它实际上打开了shadow文件。
    • 如何寻找/etc/shadow
      • 我们可将字符串作为参数传入程序,这样字符串/etc/shadow就储存在内存中。我们现在需要猜测它在哪里。
  • 示例:覆盖函数指针:

    int main(int argc, char **argv) { static char buf[16]; /* in BSS */ static int (*funcptr)(const char *str); /* in BSS */funcptr = (int (*)(const char *str))goodfunc;/* We can cause buffer overflow here */ strncpy(buf, argv[1], strlen(argv[1]));(void)(*funcptr)(argv[2]); return 0;
    }
    /* This is what funcptr would point to if we didn’t overflow it */
    int goodfunc(const char *str) { ... ...
    }

    • 函数指针(例如int (*funcptr)(char *str))允许程序员动态修改被调用的函数。我们可以通过覆盖它的地址来覆盖函数指针,使之在执行时,它调用我们指向的函数。
    • argv[]方式:将 Shellcode 储存在程序的参数中。这会使 Shellcode 储存在栈上。之后我们需要猜测它的地址(就像我们在栈溢出中那样)。这个方式需要可执行的栈。
    • 堆方式:将 Shellcode 储存在堆或 BSS 中(通过使用溢出)。之后我们需要猜测它的地址,并将估算的地址赋给函数指针。这个方式需要可执行的堆(比可执行的栈概率更大)。
  • 函数指针
    • 函数指针可以通过多种手段储存在堆或 BSS 中。这不需要由程序员定义。
    • 如果程序调用了atexit,函数指针就会由atexit储存在堆上,并且会在程序终止前调用。
    • svc/rpc注册函数(librpc, libnsl以及其他)将回调函数储存在堆上。
  • 其它示例
    • BSDIcrontab基于堆的溢出:长文件名的传递会溢出静态缓冲区。在内存中的缓冲区上面,我们拥有pwd结构,它储存用户名、密码、UID、GID,以及其他。通过覆盖pwd的 UID/GID 字段,我们可以修改权限,使crond使用它执行我们的crontab(只要他尝试执行我们的crontab)。这个脚本之后可以产生 Suid Root Shell,因为我们的脚本会使用 UID/GID 0 来执行。

参考

  1. P. J. Salzman. Memory Layout And The Stack. In Book Using GNU’s GDB Debugger. URL: http://dirac.org/linux/gdb/02a-Memory_Layout_And_The_Stack.php.

雪城大学信息安全讲义 4.5相关推荐

  1. 雪城大学信息安全讲义 4.1~4.2

    四.缓冲区溢出漏洞和攻击 原文:Buffer-Overflow Vulnerabilities and Attacks 译者:飞龙 1 内存 这个讲义的"区域"(Area)和&quo ...

  2. 雪城大学信息安全讲义 3.1 Set-UID 机制如何工作

    三.Set-UID 特权程序 原文:Set-UID Programs and Vulnerabilities 译者:飞龙 这个讲义的主要目标就是来讨论特权程序,为什么需要他们,他们如何工作,以及它们有 ...

  3. 雪城大学信息安全讲义 3.3 提升 Set-UID 程序的安全性

    3 提升 Set-UID 程序的安全性 exec函数 exec函数系列通过将当前进程映像包装为新的,来运行紫禁城.有许多exec函数的版本,工作方式不同.它们可以归类为: 使用/不适用 Shell 来 ...

  4. 雪城大学信息安全讲义 七、格式化字符串漏洞

    七.格式化字符串漏洞 原文:Format String Vulnerability 译者:飞龙 printf ( user_input ); 上面的代码在 C 程序中十分常见.这一章中,我们会发现如果 ...

  5. 雪城大学信息安全讲义 六、输入校验

    六.输入校验 原文:Input Validation 译者:飞龙 1 环境变量(隐藏的输入) 环境变量是隐藏的输入.它们存在并影响程序行为.在编程中忽略它们的存在可能导致安全隐患. PATH 在 Sh ...

  6. 雪城大学信息安全讲义 五、竞态条件

    五.竞态条件 原文:Race Condition Vulnerability 译者:飞龙 1 竞态条件漏洞 下面的代码段属于某个特权程序(即 Set-UID 程序),它使用 Root 权限运行. 1: ...

  7. 雪城大学信息安全讲义 4.3~4.4

    3 对抗措施 3.1 应用安全工程原则 使用强类型语言,例如 Java.C#,以及其他.使用这些语言,可以避免缓冲区溢出. 使用安全的库函数 可能拥有缓冲区溢出问题的函数:gets.strcpy.st ...

  8. 雪城大学信息安全讲义 3.2 Set-UID 程序的漏洞

    2 Set-UID 程序的漏洞 2.1 隐藏的输入:环境变量 特权程序必须对所有输入进行安全检查.输入检查实际上是访问控制的一部分,特权程序必须这么做,来确保程序的安全.很多安全问题都是输入检查的错误 ...

  9. 雪城大学信息安全讲义 二、Unix 安全概览

    二.Unix 安全概览 原文:Unix Security Basics 译者:飞龙 1 用户和用户组 用户 root:超极用户(UID = 0) daemon:处理网络. nobody:不拥有文件,用 ...

最新文章

  1. 15℃!人类首次实现高压下室温超导,研究登上Nature封面
  2. Spring Boot中验证码实现kaptcha
  3. 文件描述符在内核态下的一些小把戏
  4. idea社区版和企业版区别_IntelliJ IDEA 旗舰版与社区版有什么不同
  5. spark1.3.1使用基础教程
  6. iOS开发UI篇—模仿ipad版QQ空间登录界面
  7. 学术前沿 | Texar-PyTorch:在PyTorch里重现TensorFlow的最佳特性
  8. 计算机网络管理2018版,2018~2019学年度第二学期“计算机网络管理”专业技能竞赛火热进行中...
  9. Python:[-1]、[:-1]、[::-1]、[n::-1] 原理大详解(超全超仔细!)
  10. Tableau上面地图与条形图结合_Tableau | 20种常用图表(上文)
  11. 雷林鹏分享:jQuery EasyUI 树形菜单 - 创建带复选框的树形菜单
  12. 初学FPGA一些建议
  13. 数据库 之 Mysql的表分区
  14. 高并发服务器逻辑处理瓶颈,如何解决?
  15. 【】论晚睡晚起的危害
  16. 苹果手机屏幕镜像_苹果手机还能一键投屏?点一下小屏变大屏幕,看剧是真畅快...
  17. 一个数根号3怎样用计算机计算,根号3等于多少怎么算
  18. matlab补帧,超清还不够,插帧算法让视频顺滑如丝丨NeurIPS 2019
  19. 股票指标接口合集 macd指标接口api kdj指标接口api,均线指标接口api,价格api
  20. Ruby On Rails 4 hello world,Ruby On Rails上手

热门文章

  1. 利用Vivado封装DCP文件基本流程
  2. 高中计算机课程打字网址,信息课
  3. AD学习笔记2021-5-29
  4. 单片机测量代码运行时间方法-STM32
  5. 关于Python ord()和chr()返回ASCII码和Unicode码的看法
  6. 查看mysql某人执行了什么语句_详解MySQL如何监控系统全部执行过的sql语句
  7. redhat升级linux内核,用rpm方式升级RHEL6.1内核
  8. 【Java数据结构与算法】第十一章 顺序存储二叉树、线索二叉树和堆
  9. Linux常用命令小结(一)
  10. 在死循环中使用Scanner获得键盘输入