
也就是说,缓冲区记住目录中的内容、文件权限是什么,并跟踪从某个块设备中写入或读取到哪些内存。
缓存只包含文件本身的内容。
8.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
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)