《缓冲区溢出攻击实践》以实践者角度介绍了初级缓冲区溢出攻击方法,本文从原理上对该方法做原理性介绍。

函数帧结构

现在高级语言C(或者C++),在函数开头的几指令要建立好函数帧结构,而函数返回时要撤消函数帧。当前在不同的CPU体系加构或者ABI标准,这些函数帧结构有一些差别,但原理上是相通的。
我们还是以之前的示例代码作为分析对象,讨论在fread函数填数据到buf变量前的栈结构。
下面是机器上对stack1程序 main函数反编译的结果:
(gdb) disassemble main
Dump of assembler code for function main:0x08048484 <+0>:     push   %ebp0x08048485 <+1>:     mov    %esp,%ebp0x08048487 <+3>:     and    $0xfffffff0,%esp0x0804848a <+6>:     sub    $0x40,%esp0x0804848d <+9>:     mov    $0x80485e0,%edx0x08048492 <+14>:    mov    $0x80485e2,%eax0x08048497 <+19>:    mov    %edx,0x4(%esp)0x0804849b <+23>:    mov    %eax,(%esp)0x0804849e <+26>:    call   0x80483c0 <fopen@plt>0x080484a3 <+31>:    mov    %eax,0x3c(%esp)0x080484a7 <+35>:    cmpl   $0x0,0x3c(%esp)0x080484ac <+40>:    jne    0x80484c1 <main+61>0x080484ae <+42>:    movl   $0x80485ea,(%esp)0x080484b5 <+49>:    call   0x8048380 <perror@plt>0x080484ba <+54>:    mov    $0x1,%eax0x080484bf <+59>:    jmp    0x80484ff <main+123>0x080484c1 <+61>:    lea    0x1c(%esp),%eax0x080484c5 <+65>:    mov    0x3c(%esp),%edx0x080484c9 <+69>:    mov    %edx,0xc(%esp)0x080484cd <+73>:    movl   $0x1,0x8(%esp)0x080484d5 <+81>:    movl   $0x400,0x4(%esp)0x080484dd <+89>:    mov    %eax,(%esp)0x080484e0 <+92>:    call   0x8048390 <fread@plt>0x080484e5 <+97>:    mov    $0x80485f0,%eax0x080484ea <+102>:   lea    0x1c(%esp),%edx0x080484ee <+106>:   mov    %edx,0x4(%esp)0x080484f2 <+110>:   mov    %eax,(%esp)0x080484f5 <+113>:   call   0x8048370 <printf@plt>0x080484fa <+118>:   mov    $0x0,%eax0x080484ff <+123>:   leave0x08048500 <+124>:   ret
End of assembler dump.

在函数体里面最先执行的几条指令,通常称为function prologue,它完成建立函数帧的功能。

0x08048484 <+0>  push %ebp 
0x08048485 <+1>  mov %esp,%ebp 
0x08048487 <+3> and $0xfffffff0,%esp 
0x0804848a <+6>  sub $0x40,%esp
它的功能是:先将调用者的ebp压到栈上,然后将此时的esp作为被调用者的ebp(栈顶),然后根据函数局部变量的大小,将esp将压地址扩展,作为被调用者的esp(栈底);这样ebp和esp这对寄存器描述的栈空间就函数帧的空间。
在函数返回时,它总执行以下两条指令,通常称为function epilogue
0x080484ff <+123>   leave
0x08048500 <+124>   ret
它的功能是:先将当前函数的ebp赋给esp,然后再从栈中弹出(pop)调用者的ebp值到ebp寄存器,然后再从栈中弹出EIP值到pc寄存器。指令执行完后,ebp和esp就是父函数的函数帧。

示例程序的栈帧结构

根据上面stack1中main的反编译结果,画出如图1的栈结构:
图1: fread函数调用函数,栈帧结构图
这里重点关注一下buf变量在栈中的位置,当buf变量发生溢出时,就会往高地址空间覆盖。先是覆盖main函数的其它局部变量(图1没有画出来),然后是父函数的ebp,再次重点是eip,最后是父函数的栈空间。我们不关心覆盖父函数的栈空间,因为我们根本不打算返回父函数执行。

缓冲区溢出后栈内容

当前fread从bad.txt读取文件内容到buf缓冲区并发生溢出后,整个栈空间内容如图2所示:
图2:fread从bad.txt文件读取数据产生溢出后的栈数据
当函数返回时,ret指令将0xffffd710弹给pc寄存,就开始执行shellcode了。

小结

本文以示例程序为蓝本,分析程序的栈帧结构,以及攻击方法如何利用该结构控制EIP,改变程序执行流程,从而让程序掉到shellcode的坑里面。
============= 回顾一下本系列文章 ==============
  • 缓冲区溢出攻击实践
  • 缓冲区溢出攻击原理分析
  • 初识shellcode
  • 如何编写本地shellcode
  • 编写shellcode测试工具
  • 使用ret2reg攻击绕过地址混淆
  • 使用ret2libc攻击方法绕过数据执行保护

缓冲区溢出攻击原理分析相关推荐

  1. “缓冲区溢出攻击”原理分析及实例演示

    一.原理分析 缓冲区溢出是一种非常普遍.非常危险的漏洞,在各种操作系统.应用软件中广泛存在.利用缓冲区溢出攻击,可以导致程序运行失败.系统宕机.重新启动等后果.更为严重的是,可以利用它执行非授权指令, ...

  2. 缓冲区溢出攻击原理、方法及防范(一)

    由于C/C++语言本身没有数组越界检查机制,当向缓冲区里写入的数据超过了为其分配的大小时,就会发生缓冲区溢出. 攻击者可以利用缓冲区溢出来窜改进程运行时栈,从而改变程序的正常流向.在分析缓冲区溢出攻击 ...

  3. 计算机缓冲器原理,缓冲区溢出攻击原理-信息安全工程师知识点

    信息安全工程师知识点:缓冲区溢出攻击原理 缓冲区是计算机内存中的一个连续块,保存了给定类型的数据.当进行大量动态内存分配而又管理不当时,就会出现问题.动态变量所需要的缓冲区,是在程序运行时才进行分配的 ...

  4. 关于缓冲区溢出攻击原理的简单例子(C语言编写)

    一.什么是缓冲区溢出? 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,使得溢出的数据覆盖在合法数据上,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈 ...

  5. linux缓冲区攻击实验报告,linux 下缓冲区溢出攻击原理及示例

    一.溢出目标 无论是在windows下还是在linux下,溢出攻击基本上都是以控制计算机的执行路径为目标,而x86下执行哪条指令是由eip寄存器来控制的,所以如果能够修改eip寄存器的值,就可以修改计 ...

  6. 缓冲区溢出攻击(详细解析)

    定义:利用缓冲区溢出漏洞进行攻击行动 攻击原理 通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的.造成缓冲区溢出的原因是程序中没有仔 ...

  7. 实验8 缓冲区溢出攻击实验

    实验8 缓冲区溢出攻击实验 缓冲区溢出是目前最常见的一种安全问题,操作系统以及应用程序大都存在缓冲区溢出漏洞.缓冲区是一段连续内存空间,具有固定的长度.缓冲区溢出是由编程错误引起的,当程序向缓冲区内写 ...

  8. 缓冲区溢出攻击(Buffer Overflows实验笔记)

    缓冲区溢出是什么? 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数 ...

  9. 计算机系统实验五:缓冲区溢出攻击

    参考教材:计算机系统基础 第二版 袁春风 机械工业出版社 参考慕课:计算机系统基础(四):编程与调试实践 https://www.icourse163.org/learn/NJU-1449521162 ...

最新文章

  1. jquery 获取一组元素的选中项 - 函数、jquery获取复选框值、jquery获取单选按钮值...
  2. CCF 201703-3 Markdown
  3. 从 DevOps 到 Serverless
  4. 残疾人无障碍设施工程改造送上门 900户家庭
  5. 数码管和573锁存器的细节问题
  6. “云原生全家桶“KubeSphere 如何让企业从容迈进云原生时代?
  7. Tuxera NTFS教程:在Mac上如何将MS-DOS文件系统格式化为NTFS文件系统?
  8. android activity透明主题,Android应用的全透明效果--Activity及Dialog的全透明
  9. postgresql如何让主键自增
  10. ServerProperties
  11. DWZUI(1.3)框架中遇到的两个问题
  12. 计算机基础线性代数还有,大学计算机基础 word作业.doc
  13. 修改phpMyAdmin使其能够管理多台远程MySQL服务器
  14. 使用java 语言 提取excel 中的手机号码,xls 格式以及xlsx 格式的excel 文件
  15. 步进电机的正反向旋转c语言编程,实现步进电机自动正反转程序怎么写
  16. #define c# 报错_天轰穿C#教程之#define和#undef【原创】
  17. 团队作业7——Alpha冲刺之事后诸葛亮
  18. redis-cli使用说明
  19. android卡在gradle,Android Studio打开新项目卡在Gradle的问题
  20. 京东到家大数据平台演进实战

热门文章

  1. git 删除 已提交的 文件
  2. 钟雅涵:端午魔咒?黄金牛市刚启动,原油摇旗冲新高
  3. LInux 服务器状态查询
  4. 科学与艺术的融合:遗传算法绘制蒙娜丽莎
  5. 设计模式-外观模式与组合模式
  6. 学生专用计算机的小游戏,最适合学生党的三款笔记本电脑,办公游戏两不误!...
  7. 使用Python实现个人天气预警提醒
  8. LifeSmart云起与新世界中国达成战略合作,共推地产数字化建设
  9. 【线性代数】MIT Linear Algebra Lecture 6: Column space and nullspace
  10. phpcms v9 模板对应表