盾怪网教程:是一个免费提供流行杀毒软件教程、在线学习分享的学习平台!

编写自己的缓冲区溢出使用程序

时间:2024/10/30作者:未知来源:盾怪网教程人气:

[摘要](内存低址) 我们注意到在vulFunc函数栈帧中所分配的那十二个字节, 从传递给strcpy函数的起始 地址处被我们所输入的八个'A'(十六进制0x41)填充了. 这是我们的第二个...
 
(内存低址) 

我们注意到在vulFunc函数栈帧中所分配的那十二个字节, 从传递给strcpy函数的起始 
地址处被我们所输入的八个'A'(十六进制0x41)填充了. 

这是我们的第二个焦点. 

同时也注意到, 内存地址0xbffff6a8所指向的四个字节的内容由原来的垃圾数据0xbffff6b8 
变成了bffff600. 

低字节的00应该就是字符串"AAAAAAAA"的零结尾字节. 

所以得出结论: vulFunc函数栈帧中分配的那十二个字节是给局部变量buf(缓冲区)的. 
这里会奇怪: 程序中buf缓冲区只定义了十个字节的大小, 为什么为它分配了十二个字 
节? 原因是: 内存的分配是以四字节为单位的.所以十个字节(4+4+2)要用三个内存分 
配单元, 3*4=12. 

如果我们在命令行提供的字串长度为十(多两个字符, 刚好是程序中定义的缓冲区的大 
小), 那么内存地址0xbffff6a8所指向的四个字节的内容将是bf004141; 如果增加到十 
一个, 内存地址0xbffff6a8所指向的四个字节的内容为00414141, 刚好填满栈帧中分配 
给buf的内存空间. 可以看出, 在命令行中提供的字串长度小于12, 程序是不会出错的. 

现在让我们看看字串长度等于十二的情况, 这时0xbffff6a8所指向的四个字节的内存单 
元已被41414141填满.0xbffff6ac所指向的四个字节的内存单元的低字节被00所填, 其内 
容变为bffff600, 从上面的影像图可知: 这个内存单元里保存的是调用函数的ebp. 也就 
是说, 当字串长度大于或等于十二时, 调用函数的ebp被复盖. 

从进程的影像图可以看出, 要想全面复盖vulFunc函数的返回地址, 则字节串的长度至少 
要二十(12+8)个字节. 

我们继续分析后面的指令: 
0x8048413 <vulFunc+19>: add $0x8,%esp ; 栈帧缩小8个字节--放弃了两个内存存储单元. 

可以看到, 在调用strcpy前, 依次压了s和buf的地址入栈, 现在这条指令是把这两个地址抛弃. 

所以可以得出, Linux x86系统在调用函数时(其实是编译器所生成的机器指令), 所传给 
被调用函数的参数是由调用函数从右到左依次入栈的. 
如现在的strcpy(buf, s), 首先是s先入栈, 然后是buf. 参数的出栈也由调用函数负责. 

0x8048416 <vulFunc+22>: lea 0xfffffff4(%ebp),%eax 
0x8048419 <vulFunc+25>: push %eax 
这两条指令和前面的一样, 把argv[1](即"AAAAAAAA"字串)的起始地址入栈. 

0x804841a <vulFunc+26>: push $0x80484b0 
先看一下0x80484b0里面放的是什么, 虽然很明显是即将调用的printf函数的第一个参数的地址. 
(gdb) x/1s 0x80484b0 
0x80484b0 <_IO_stdin_used+4>: "String=%s\n" 
果然是. 

下面的两条指令就是调用printf函数和抛弃在栈中的两个参数了. 
0x804841f <vulFunc+31>: call 0x8048330 <printf> 
0x8048424 <vulFunc+36>: add $0x8,%esp 

我们在0x08048427 leave 指令的前面设个断点并继续运行. 
(gdb) b *0x8048427 
Breakpoint 5 at 0x8048427 
(gdb) c 
Continuing. 
String=AAAAAAAA 

Breakpoint 5, 0x8048427 in vulFunc () 
屏幕输出了"String=AAAAAAAA". 

这时栈帧的内容为: 
(gdb) x/15x $esp 
0xbffff6a0: 0x41414141 0x41414141 0xbffff600 0xbffff6b8 
0xbffff6b0: 0x08048443 0xbffff856 0xbffff6d8 0x400349cb 
0xbffff6c0: 0x00000002 0xbffff704 0xbffff710 0x40013868 
0xbffff6d0: 0x00000002 0x08048350 0x00000000 

进程在内存中的相关影像为: 
(内存高址) 

关键词:编写自己的缓冲区溢出运用程序




Copyright © 2012-2018 盾怪网教程(http://www.dunguai.com) .All Rights Reserved 网站地图 友情链接

免责声明:本站资源均来自互联网收集 如有侵犯到您利益的地方请及时联系管理删除,敬请见谅!

QQ:1006262270   邮箱:kfyvi376850063@126.com   手机版