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

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

时间:2024/6/12作者:未知来源:360教程人气:

[摘要](内存低址) 接下来的两条指令: 0x804842f <main+3>: cmpl 0x2,0x8(%ebp) ; 2和ebp+8所指向的内存(32位--4 ; 个字节)里面所放的内容比...
 
(内存低址) 

接下来的两条指令: 
0x804842f <main+3>: cmpl $0x2,0x8(%ebp) ; 2和ebp+8所指向的内存(32位--4 
; 个字节)里面所放的内容比较. 
0x8048433 <main+7>: jne 0x8048448 <main+28> ; 如果不等则跳到0x08048448地址 
; 处继续执行, 否则执行下条指令. 
这里我们可以看到这是C语言语句 
if(argc == 2) 

... 

else 

... 

的等价汇编语句. 内存地址ebp+8处存放的是argc的值. 
(gdb) x/x $ebp+8 
0xbffff6c0: 0x00000002 

我们来看看在调用vulFunc函数前的指令: 
0x8048435 <main+9>: mov 0xc(%ebp),%eax ; 把内存地址ebp+12处的四个字节的 
; 内容放到eax里. 
0x8048438 <main+12>: add $0x4,%eax ; eax等于eax+4. 
0x804843b <main+15>: mov (%eax),%edx ; 把eax指向的四个内存字节单元里 
; 的内容赋给edx 
0x804843d <main+17>: push %edx ; esp等于esp-4, 把edx的值放到esp 
; 所指的内存地址的四个字节单元里. 

看看ebp+12处放的是什么? 
(gdb) x/x $ebp+12 
0xbffff6c4: 0xbffff704 
怀疑这里放的是指向argv[0]字串的地址的地址, 看看是不是 
(gdb) x/x 0xbffff704 
0xbffff704: 0xbffff83e 
(gdb) x/1s 0xbffff83e 
0xbffff83e: "/home/vcat/p" 
果然是. 那么$ebp+12的所指的四个字节的内容(argv[0]字串的地址)加上四, 应该就是指向 
argv[1]字串的地址了. 
(gdb) x/x 0xbffff704+4 
0xbffff708: 0xbffff856 
(gdb) x/1s 0xbffff856 
0xbffff856: "AAAAAAAA" 

可以看出, 这四条指令是用来计算argv[1](即所输入的字串"AAAAAAAA"在内存中的起始地址), 
然后把该地址压入栈中做为参数传给即将被调用的函数vulFunc的. 

设个断点在0x804843e, 让程序继续执行到调用vulFunc函数之前. 
(gdb) b *0x804843e 
Breakpoint 2 at 0x804843e 
(gdb) c 
Continuing. 

(gdb) i reg 
eax 0xbffff708 -1073744120 
ecx 0x804842c 134513708 
edx 0xbffff856 -1073743786 
ebx 0x4010c1ec 1074840044 
esp 0xbffff6b4 -1073744204 
ebp 0xbffff6b8 -1073744200 
esi 0x4000ae60 1073786464 
edi 0xbffff704 -1073744124 
eip 0x804843e 134513726 
eflags 0x282 642 
(以下省略) 
... 

(gdb) x/10x $esp 
0xbffff6b4: 0xbffff856 0xbffff6d8 0x400349cb 0x00000002 
0xbffff6c4: 0xbffff704 0xbffff710 0x40013868 0x00000002 
0xbffff6d4: 0x08048350 0x00000000 

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

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




Copyright © 2012-2018 360教程(http://www.360sd.cn) .All Rights Reserved 网站地图 友情链接

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

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