Linux中的缓冲区和缓存内存有什么区别

Linux中的缓冲区和缓存内存有什么区别,第1张

缓冲区与特定的块设备相关联,包括文件系统元数据的缓存以及页面跟踪。缓存只包含已停放的文件数据。

也就是说,缓冲区记住目录中的内容、文件权限是什么,并跟踪从某个块设备中写入或读取到哪些内存。

缓存只包含文件本身的内容。

8.1 缓冲区溢出攻击原理

1. 局部变量堆栈的关系

在一个程序中,会声明各种变量。静态全局变量是位于数据段并且在程序开始运行的时候被初始化,而局部变量则在堆栈中分配,只在该函数内部有效。

如果局部变量使用不当,会造成缓冲区溢出漏洞。例如,以下程序将命令行的第1个参数拷贝到buf局部变量中。

int main(int argc, char **argv)

{

char buf[80]

strcpy(buf, argv[1])

}

在一次函数调用中,堆栈中将被依次压入:参数、返回地址。如果函数有局部变量,接下来,就在堆栈中开辟相应的空间(SUB ESP,x)以构造变量。函数执行结束时,恢复堆栈到函数调用的地址,d出返回地址到EIP以继续执行程序。

例如,调用函数main(int argc, char **argv)时,堆栈的使用情况如图8-1所示。

ESP→

← buf →

寄存器

寄存器

寄存器

ESP→

EIP

EIP

ESP→

EIP

EIP

argc

argc

argc

ESP→

argc

argv

argv

argv

ESP→

1)调用之前 2)参数、EIP压栈3)寄存器压栈 4)释放局部变量 5)返回

分配局部变量 寄存器出栈

图8-1 函数调用与堆栈

从上述main函数的反汇编代码中,第3步对应的代码为00401000H~00401003H,指令“sub esp,50h”在堆栈中分配了80个字节作为局部变量buf的内存空间。

00401000 pushebp

00401001 mov ebp,esp

00401003 sub esp,50h

00401006 mov eax,dword ptr [ebp+0Ch]

00401009 mov ecx,dword ptr [eax+4]

0040100C pushecx

0040100D lea edx,[ebp-50h]

00401010 pushedx

00401011 call00401020

00401016 add esp,8

00401019 mov esp,ebp

0040101B pop ebp

0040101C ret

打开bomain工程,在Release模式下编译。如图8-2所示,选择菜单Project→Settings…下,在“Win32 Release”的“Debug”页中,设定“Program arguments”为字符串“This is test result of buffer overflow demo code.”。加双引号的目的是将整个字符串作为一个参数,即argv[1],否则,这个字符串将被分解为多个参数,argv[1]=This,argv[2]=is等等。

图8-2 设定程序运行参数

程序在Release模式下编译、运行,不能直接在源程序中设置断点。编译完成后,按F11键,VC提示没有调试信息,按“OK”按钮继续运行。这时,按Ctrl+G,在左侧选择“Address”,编辑框内输入00401000,显示main函数所在地址的汇编代码,如图8-3所示。

图8-3 显示指定地址处的汇编代码

在“00401019”一行按F9设置断点,按F5执行程序,执行到“00401019”处程序进入断点,EIP、ESP、EBP寄存器的值为:

EIP = 00401019 ESP = 0012FF30 EBP = 0012FF80

在内存窗口的地址栏输入ESP,显示堆栈中的内容为:

0012FF30 54 68 69 73 20 69 73 20 74 65 73 74 20 72 65 73 This is test res

0012FF40 75 6C 74 20 6F 66 20 62 75 66 66 65 72 20 6F 76 ult of buffer ov

0012FF50 65 72 66 6C 6F 77 20 64 65 6D 6F 20 63 6F 64 65 erflow demo code

0012FF60 2E 00 FF FF 8D 16 F5 77 69 1E 40 00 00 00 37 00 ........i.@...7.

0012FF70 00 00 00 00 88 49 37 00 00 00 00 00 61 12 40 00 .......7.....a.@.

0012FF80 C0 FF 12 00 C4 11 40 00 02 00 00 00 80 0E 41 00 ......@.......A.

buf的地址为0012FF30,可以看到argv[1]的内容已经被拷贝到buf中。

后面一行中,“00000002”为堆栈中的argc,“00410E80”为堆栈中的argv,“004011C4”为堆栈中的

0012FF80 0012FFC0 004011C4 00000002 00410E80


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/9023578.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-24
下一篇2023-04-24

发表评论

登录后才能评论

评论列表(0条)

    保存